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

94

我正在使用JDK8(在我的Eclipse工作空间上尝试过Win x64 u25 JDK和由Jenkins启动的Linux-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

我已经尽可能地尝试了一切方法,并在谷歌上搜索了很长时间,但都没有成功。我发现有些人有类似的问题,但没有关于可能解决方案的任何信息:

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更新到>更新20,我已经这样做了,但问题仍然存在)。

是否有任何提示或是否有人也遇到过这种情况(不幸的是,由于某种原因,它看起来相当“罕见”)? 对此非常绝望...


1
你确定你已经正确安装了8u20吗? - JamesB
我在使用GRADLE时遇到了同样的问题 - 这是因为我的路径上有JDK 1.7,但JAVA_HOME指向了一个1.8 JDK - 感谢@JamesB。 - BretC
我也遇到了同样的问题,但我使用的是8u31版本。 - RedDeckWins
10个回答

158

这似乎是由于javax.transaction.Transactional(或者你的classpath中的任何其他类)本身带有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要求传递依赖项在类路径中,而JDK 7则更宽松。 - Jesse Glick
11
该项 Maven 依赖为: javax.interceptor javax.interceptor-api 1.2 - Tim van der Lippe
非常感谢,@kozlovda,问题已解决。很抱歉回答检查的时间有点长 - 在此期间一直在处理完全不同的事情,无法找到时间在旧工作区验证这个答案 :-) - Michal Aron
谢谢@kozlovda,这帮了很多:) - Sercan Ozdemir
10
最好将其作为maven-javadoc-plugin的附加依赖项添加,因为问题仅在javadoc生成过程中出现冲突:<additionalDependencies> <additionalDependency> <groupId>javax.interceptor</groupId> <artifactId>javax.interceptor-api</artifactId> <version>1.2</version> </additionalDependency> </additionalDependencies> - lpratlong
有没有一种方法可以修复所有缺失的依赖项?我已经开始添加依赖项,但是然后我不断收到下一个错误,再下一个错误... 到目前为止:javax.interceptor-api、javax.ejb、javax.inject、javax.persistence、org.apache.commons.collections... 看起来像是永无止境的故事... - Daniel Rodríguez

60

正如 @kozlovda 已经提到的,这个问题是与 @Transactional 注释 (javax.transaction.Transactional) 相关的。

如果您在运行Spring应用程序的Maven时出现了描述的错误,还有另一种解决方法: 确保不要使用来自 javax.transaction 的注释,而是使用 org.springframework.transaction.annotation.Transactional

替换导入即可修复该问题。


谢谢!我的一个控制器类的javadoc总是失败,我没有直接看到原因。它是唯一一个使用javax.Transactional导入的类。 - rdhaese
4
谢谢,这是正确的修正方法。如果你在编写Spring应用程序,则应该使用Spring事务处理,即使Spring支持javax EJB事务处理。而且你不应该混合使用这两种不同的Transactional(事务)。我曾经遇到过Javadoc的相同问题,在成千上万个类中我发现有一个类导入了javax.transactional。Javadoc和这个注释帮助我找到了真正的错误。 - pdenti
这是一个很好的答案,我认为对于大多数情况来说都是正确的。通常在Spring中使用@Transactional,所以你误解了注释也是有道理的。 - Phate
这应该是正确的答案,也是最不具侵入性的。 - jediwompa
很棒的答案,解决了问题。 - Tanel

15

@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
我个人认为这是最好的答案,因为在插件配置中添加依赖项可以清楚地表明该插件需要此依赖项。 - pyb
不错,只涉及问题本身。 - Gunnar

13

使用

import org.springframework.transaction.annotation.Transactional;

替代

import javax.transaction.Transactional;

当你在使用Spring的@Transactional时,

11

您还可以将以下行添加到您的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>

6
这个回答实际上并没有解决问题,而是掩盖了它。将failOnError=true设置为true可以让Maven继续进行构建,但由于JavaDoc中止,因此并未生成所有文件。例如,可能没有生成所有索引文件。你认为带有截断JavaDocs的构建算是一个成功的构建吗? - Martín Straus

2

InterceptorBinding 可以在以下 Maven 依赖中使用:

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

1

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

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

修复了问题。

0

这个稍微现代一点的依赖项也可以用来解决这个问题:

<dependency>
    <groupId>jakarta.interceptor</groupId>
    <artifactId>jakarta.interceptor-api</artifactId>
    <version>1.2.5</version>
</dependency>

0

请按以下方式替换

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

-6

你也可以在POM文件中添加Maven依赖项。这对我解决了这个问题。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接