89

我正在使用 JDK8(在 Jenkins 启动的 Linux 上使用 Win x64 u25 JDK + 在我的 Eclipse 工作区上进行了尝试 - 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,我这样做了,但问题仍然存在相同)。

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

4

10 回答 10

151

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

于 2015-02-27T00:44:45.210 回答
55

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

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

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

于 2016-07-06T18:41:45.423 回答
14

@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 管理版本,只需根据需要恢复。

于 2017-12-19T14:54:14.333 回答
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>
于 2015-01-07T11:15:34.517 回答
6

利用

import org.springframework.transaction.annotation.Transactional;

代替

import javax.transaction.Transactional;

当您将 @Transactional 与 Spring 一起使用时

于 2020-01-27T17:07:03.217 回答
2

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

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>
于 2018-07-22T08:45:43.297 回答
1

我对 Spring-Boot 2 Kotlin 和 gradle 也有同样的问题。正如@kozlovda 建议的那样:

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

解决了问题

于 2018-09-07T14:48:14.467 回答
0

替换如下

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService
于 2019-09-05T11:51:46.703 回答
0

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

<dependency>
    <groupId>jakarta.interceptor</groupId>
    <artifactId>jakarta.interceptor-api</artifactId>
    <version>1.2.5</version>
</dependency>
于 2021-10-27T20:02:40.860 回答
-6

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

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
于 2016-12-28T15:43:40.523 回答