JDK8 - 找不到javax.interceptor.InterceptorBinding的错误"类文件"尝试使用Maven javadoc插件生成javadoc时

时间:2015-01-06 23:00:09

标签: java maven java-8 maven-javadoc-plugin

我正在使用JDK8(在我的Eclipse工作区上尝试使用Jenkins推出的Linux上的Win x64 u25 JDK + - 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更新为&gt;更新20,我做了,但问题仍然相同)。

任何提示或任何人都经历过这种行为(不幸的是,由于某些原因,它看起来非常“罕见”)? 非常绝望...

9 个答案:

答案 0 :(得分:99)

这似乎是由javax.transaction.Transactional(或类路径中的任何其他类)引起的javax.interceptor.InterceptorBinding注释,除非在依赖项中显式声明,否则在classpath中缺少:

@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注释)。

虽然可以更具体地说明这个&#34;错误&#34;已被发现。

问题修复:添加javax.interceptor:javax.interceptor-api:1.+依赖项修复了问题。

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

答案 1 :(得分:25)

正如@kozlovda已经提到的那样,问题在于@Transactional注释(javax.transaction.Transactional)。

如果您在Spring应用程序的Maven运行中遇到了所描述的错误,还有另一种方法可以解决此问题: 请务必不要使用javax.transaction中的注释,而是使用org.springframework.transaction.annotation.Transactional

替换导入为我解决了问题。

答案 2 :(得分:10)

您还可以将以下行添加到javadoc maven配置中:<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>

答案 3 :(得分:8)

@lpratlong在评论中提供的答案中说#34;将其添加为maven-javadoc-plugin&#34;的附加依赖项。这对我有用,这里是像我这样的不耐烦的人复制粘贴的完整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管理版本,只需根据需要进行恢复。

答案 4 :(得分:5)

使用

import org.springframework.transaction.annotation.Transactional;

代替

import javax.transaction.Transactional;

在Spring上使用@Transactional时

答案 5 :(得分:2)

InterceptorBinding在以下maven依赖项中可用:

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

答案 6 :(得分:0)

我在Spring-Boot 2 Kotlin和gradle中遇到了相同的问题。 正如@kozlovda所建议的:

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

解决了问题

答案 7 :(得分:0)

替换如下

ISBLANK

答案 8 :(得分:-3)

您还可以将Maven依赖项添加到POM文件中。它为我解决了这个问题

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>