java - JDK8 - 尝试使用 Maven javadoc 插件生成 javadoc 时出现错误 "class file for javax.interceptor.InterceptorBinding not found"

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

我正在使用 JDK8(在 Jenkins 启动的 Linux 上使用 Win x64 u25 JDK + 在我的 Eclipse 工作区上进行了尝试 - 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更新为> update 20,我也这样做了,但问题还是一样)。

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

最佳答案

这似乎是由于 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

关于java - JDK8 - 尝试使用 Maven javadoc 插件生成 javadoc 时出现错误 "class file for javax.interceptor.InterceptorBinding not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27808734/

相关文章:

java - android studio 设置 java 版本 1.7

java - Thymeleaf 中的多个 if else 条件

eclipse - 如何告诉 Maven 更新 list 的 Bundle-Version?

linux - 即使在 session 超时后如何使 spring-boot 应用程序保持事件状态

java - 用于序列化@RequestBody的单例bean有多个对象

java - 将数据存储到 GlobalKTable

Java 的 CompletableFuture 和线程

java - 在 Java 8 中从 Stream of Streams 中提取 Map<K, Multiset<V>>

java - 使用 Nexus Repository OSS 3 创建 Maven 项目 [离线]

java - 解析 HH :mm:ss and H:mm:ss for LocalTime using single DateTimeFormatter in java8