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

2022-08-31 11:11:43

我正在使用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

我已经尝试了一切可能,并试图在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更新到>更新20,我做到了,但问题仍然是一样的)。

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


答案 1

这似乎是由于(或类路径中的任何其他类)本身被注释为 ,除非在依赖项中显式声明,否则类路径中缺少 :javax.transaction.Transactionaljavax.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.+(或),通常用于JPA / ORM / JMS应用程序中以注释事务方法。org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final
  • javax.interceptor.InterceptorBinding- 应该附带javax.interceptor:javax.interceptor-api:1.+。但是,尽管在 之上声明,但对于正常操作不是必需的,并且(看起来正因为如此)不会被获取为JPA框架的传递依赖项。Transactional

因此,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

正如@kozlovda已经提到的,问题来自注释()。@Transactionaljavax.transaction.Transactional

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

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


推荐