JDK8 - 尝试使用 Maven javadoc 插件生成 javadoc 时出错 "class file for javax.interceptor.InterceptorBinding not found"
JDK8 - Error "class file for javax.interceptor.InterceptorBinding not found" when trying to generate javadoc using Maven javadoc plugin
我正在使用 JDK8(在我的 Eclipse 工作区上用 Win x64 u25 JDK + 在 Jenkins 启动的 Linux 上试过 - jdk-8u20-linux-x64,相同两者都有问题)。
我有一个多模块 Maven 项目(我从一个主模块启动 Maven 目标 "javadoc:aggregate",打包类型为 "pom")。
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,我这样做了,但问题仍然相同)。
任何提示或任何人也经历过这种行为(不幸的是,由于某种原因它看起来很 "rare" 问题)?
对此非常绝望...
您还可以将以下行添加到您的 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>
这似乎是由于 javax.transaction.Transactional
(或您的 class 路径中的任何其他 class)本身被注释为 javax.interceptor.InterceptorBinding
,但它丢失了在 classpath 中,除非在 dependencies 中明确声明:
@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
注释)。
虽然它可以更具体地说明这个 "error" 的发现地点。
问题修复:添加 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
正如@kozlovda 已经提到的,问题来自 @Transactional
注释 (javax.transaction.Transactional
)。
如果您在 运行 的 Spring 应用程序的 Maven 运行 上遇到描述的错误,还有另一种方法可以解决该问题:
确保不要使用 javax.transaction
中的注释,而是使用 org.springframework.transaction.annotation.Transactional
.
替换导入解决了我的问题。
您还可以将 Maven 依赖项添加到 POM 文件中。它为我解决了这个问题
<dependency>
<groupId>net.sourceforge.cobertura</groupId>
<artifactId>cobertura</artifactId>
<version>2.1.1</version>
<scope>compile</scope>
</dependency>
@lpratlong 在评论 "add it as an additionnal dependencies of 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管理版本,按需恢复即可。
InterceptorBinding 在以下 Maven 依赖项中可用:
<dependency>
<groupId>javax.interceptor</groupId>
<artifactId>javax.interceptor-api</artifactId>
<version>1.2</version>
</dependency>
我在使用 Spring-Boot 2 Kotlin 和 gradle 时遇到了同样的问题。
正如@kozlovda 建议的那样:
dependencies {
compileOnly 'javax.interceptor:javax.interceptor-api:1.+'
...
解决了问题
替换如下
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class WorkingService
使用
import org.springframework.transaction.annotation.Transactional;
而不是
import javax.transaction.Transactional;
当您将 @Transactional 与 Spring
一起使用时
这个稍微更现代的依赖也可以用来解决这个问题:
<dependency>
<groupId>jakarta.interceptor</groupId>
<artifactId>jakarta.interceptor-api</artifactId>
<version>1.2.5</version>
</dependency>
我正在使用 JDK8(在我的 Eclipse 工作区上用 Win x64 u25 JDK + 在 Jenkins 启动的 Linux 上试过 - jdk-8u20-linux-x64,相同两者都有问题)。
我有一个多模块 Maven 项目(我从一个主模块启动 Maven 目标 "javadoc:aggregate",打包类型为 "pom")。
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,我这样做了,但问题仍然相同)。
任何提示或任何人也经历过这种行为(不幸的是,由于某种原因它看起来很 "rare" 问题)? 对此非常绝望...
您还可以将以下行添加到您的 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>
这似乎是由于 javax.transaction.Transactional
(或您的 class 路径中的任何其他 class)本身被注释为 javax.interceptor.InterceptorBinding
,但它丢失了在 classpath 中,除非在 dependencies 中明确声明:
@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
注释)。
虽然它可以更具体地说明这个 "error" 的发现地点。
问题修复:添加 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
正如@kozlovda 已经提到的,问题来自 @Transactional
注释 (javax.transaction.Transactional
)。
如果您在 运行 的 Spring 应用程序的 Maven 运行 上遇到描述的错误,还有另一种方法可以解决该问题:
确保不要使用 javax.transaction
中的注释,而是使用 org.springframework.transaction.annotation.Transactional
.
替换导入解决了我的问题。
您还可以将 Maven 依赖项添加到 POM 文件中。它为我解决了这个问题
<dependency>
<groupId>net.sourceforge.cobertura</groupId>
<artifactId>cobertura</artifactId>
<version>2.1.1</version>
<scope>compile</scope>
</dependency>
@lpratlong 在评论 "add it as an additionnal dependencies of 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管理版本,按需恢复即可。
InterceptorBinding 在以下 Maven 依赖项中可用:
<dependency>
<groupId>javax.interceptor</groupId>
<artifactId>javax.interceptor-api</artifactId>
<version>1.2</version>
</dependency>
我在使用 Spring-Boot 2 Kotlin 和 gradle 时遇到了同样的问题。 正如@kozlovda 建议的那样:
dependencies {
compileOnly 'javax.interceptor:javax.interceptor-api:1.+'
...
解决了问题
替换如下
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class WorkingService
使用
import org.springframework.transaction.annotation.Transactional;
而不是
import javax.transaction.Transactional;
当您将 @Transactional 与 Spring
一起使用时这个稍微更现代的依赖也可以用来解决这个问题:
<dependency>
<groupId>jakarta.interceptor</groupId>
<artifactId>jakarta.interceptor-api</artifactId>
<version>1.2.5</version>
</dependency>