JDK8-Maven javadocプラグインを使用してjavadocを生成しようとすると、エラー「javax.interceptor.InterceptorBindingのクラスファイルが見つかりません」


85

私はJDK8を使用しています(Jenkinsによって起動されたLinux上のWin x64 u25 JDK +を使用してEclipseワークスペースで試してみました-jdk-8u20-linux-x64、両方で同じ問題)。

マルチモジュールのMavenプロジェクトがあります(パッケージタイプが「pom」のメインモジュールからMavenの目標「javadoc:aggregate」を起動しています)。

Pomビルドセクションは次のようになります。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
            </configuration>
        </plugin>
    </plugins>
</build>

私はいつもエラーを受け取ります:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.1:aggregate (default-cli) on project uloan-global-build: An error has occurred in JavaDocs report generation:
[ERROR] Exit code: 1 - javadoc: error - com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for javax.interceptor.InterceptorBinding not found
[ERROR] 
[ERROR] Command line was: /usr/java/jdk1.8.0_20/jre/../bin/javadoc @options @packages

私は可能な限りすべてを試し、長い間Googleで検索しようとしましたが、成功しませんでした。私は人々が同様の問題を抱えていたが、可能な解決策についての情報がないリンクを見つけました:

http://marc.info/?l=maven-user&m=139615350913286&w=2

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%3C54101E24.6060304@gmx.de%3E(JDK8を> update 20に更新することを提案していますが、問題はまだあります同じ)。

ヒントや誰かがこの種の動作も経験しましたか(残念ながら、何らかの理由で非常に「まれな」問題のように見えます)?これについてはかなり必死です...


1
8u20を正しくインストールしましたか?
JamesB 2015年

私は私の道にJDK 1.7持っていたので、それがあったが、JAVA_HOMEが1.8 JDKを指した- -私はGradleのと同じ問題を抱えていたおかげで、@JamesB
BretC

私は同じことを打っていますが、私は8u31にいます
RedDeckWins

回答:


140

これは、javax.transaction.Transactional(またはクラスパス内の他のクラス)自体に注釈が付けられているためと思われますjavax.interceptor.InterceptorBinding。これは、依存関係で明示的に宣言されていない限り、クラスパスにありません。

@Inherited
@InterceptorBinding // <-- this ONE is causing troubles
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transactional {

と言った:

  • javax.transaction.Transactional--javax.transaction:javax.transaction-api:1。+(またはorg.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final)が付属しており、通常、JPA / ORM / JMSアプリでトランザクションメソッドに注釈を付けるために使用されます。
  • javax.interceptor.InterceptorBinding--javax.interceptor:javax.interceptor-api:1. +が付属している必要があります。ただし、上で宣言されていてもTransactional、通常の操作には必要なく、(このためのように見えますが)JPAフレームワークの推移的な依存関係としてフェッチされません。

その結果、JDK8 javadocツールはソースの処理に失敗します(ソースのいずれかに注釈が付けられている場合@Transactional)。

この「エラー」が見つかった場所については、より具体的にすることができますが。

問題の修正javax.interceptor:javax.interceptor-api:1.+依存関係を追加すると問題が修正されます

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2.2</version>
</dependency>

注(2020年1月):最新の(妥当な)バージョンは現在1.2.2です(https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-apiを参照


2
はい、これは私にとって同様の問題を解決しました。JDK 8のjavadocでは、推移的な依存関係をクラスパスに含める必要があるようですが、JDK7の方が寛容でした。
Jesse Glick 2015年

11
Mavenの依存関係は次のとおりです。<dependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor-api </ artifactId> <version> 1.2 </ version> </ dependency>
Tim van der Lippe

どうもありがとう、@ kozlovda、それはそれを解決しました。答えを確認するのに長い遅延があり申し訳ありません-その間に完全に異なる何かに取り組んでいて、古いワークスペースでこれを確認する時間が見つかりませんでした:-)
Michal Aron

ありがとう@kozlovdaこれは大いに役立ちました:)
Sercan

8
問題はjavadoc生成プロセス中の競合にのみ依存するため、maven-javadoc-pluginの追加の依存関係として追加することをお勧めします。<additionalDependencies> <additionalDependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor -api </ artifactId> <version> 1.2 </ version> </ additionalDependency> </ additionalDependencies>
lpratlong 2017年

51

@kozlovdaがすでに述べているように、この問題には@Transactional注釈(javax.transaction.Transactional)が付いています。

SpringアプリケーションのMaven実行で説明されているエラーがある場合は、問題を解決する別の方法もありjavax.transactionますorg.springframework.transaction.annotation.Transactional。からのアノテーションを使用せず、代わりにを使用してください。

インポートを置き換えると、問題が修正されました。


ありがとう!私のコントローラークラスの1つに対するjavadocは常に失敗し、その理由を直接知りませんでした。これは、javax.Transactionalにインポートされた唯一のクラスでした。
rdhaese 2017

2
おかげで、これは正しい修正です。Springアプリケーションを作成している場合は、Springがjavax EJBトランザクションをサポートしている場合でも、Springトランザクションを使用することになっています。また、2つの異なるトランザクションを混在させることは想定されていません。javadocでも同じ問題が発生し、javax.transactionalをインポートした数千のうちの1つのクラスで見つかりました。Javadocとこのコメントは、本当の間違いを見つけるのに役立ちました。
pdenti

これは素晴らしい答えであり、ほとんどの場合に正しい答えだと思います。通常、春に@Transactionalを使用しているため、アノテーションを間違えたのは理にかなっています
Phate

12

javadocmaven構成に次の行を追加することもできます<failOnError>false</failOnError>。これにより、javadocの実行ですべてのエラーを無視し、ビルドが失敗しないように指示されます。

したがって、完全なjavadocプラグイン構成は次のようになります。

<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <configuration>
               <source>1.8</source>
               <target>1.8</target>
           </configuration>
       </plugin>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
           <configuration>
               <additionalparam>-Xdoclint:none</additionalparam>
               <failOnError>false</failOnError>
           </configuration>
       </plugin>
    </plugins>
</build>

6
この答えは実際には問題に対処するのではなく、むしろそれを隠します。failOnError = trueを使用すると、Mavenはビルドを続行できますが、JavaDocが異常終了するため、すべてのファイルが生成されるわけではありません。たとえば、すべてのインデックスファイルが生成されない場合があります。切り捨てられたJavaDocを使用したビルドは成功したと見なすことができますか?
マルティン・ストラウス

12

@lpratlongは、コメントで提供された回答の中で、「maven-javadoc-pluginの追加の依存関係として追加してください」と述べています。それは私にとってはうまくいきました、これが私のようなせっかちな人々がコピーアンドペーストするための完全なMavenプラグインエントリです:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <!-- <version>3.0.0</version> -->
            <configuration>
                <!-- Silence error javax.interceptor.InterceptorBinding not found -->
                <additionalDependencies>
                    <additionalDependency>
                        <groupId>javax.interceptor</groupId>
                        <artifactId>javax.interceptor-api</artifactId>
                        <version>1.2</version>
                    </additionalDependency>
                </additionalDependencies>
            </configuration>
        </plugin>

私の場合、spring-bootがバージョンを管理し、必要に応じて復元するため、バージョンはコメント化されています。


1
プラグイン構成内に依存関係を追加すると、この依存関係がそのプラグインに必要であることが明確になるため、これがIMOのベストアンサーです。
PYB

5

使用する

import org.springframework.transaction.annotation.Transactional;

の代わりに

import javax.transaction.Transactional;

Springで@Transactionalを使用している場合


3

InterceptorBindingは、次のMaven依存関係で使用できます。

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>

1

以下のように交換してください

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

0

Spring-Boot 2Kotlinとgradleでも同じ問題が発生しました。@kozlovdaが提案したように:

dependencies {
  compileOnly 'javax.interceptor:javax.interceptor-api:1.+'
  ...

問題を修正しました


-5

Mavenの依存関係をPOMファイルに追加することもできます。それは私にとってこの問題を解決しました

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.