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


82

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

我已经尝试了所有可能的方法,并尝试在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,但我仍然这样做,但问题仍然存在相同)。

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


1
确定要正确安装8u20吗?
JamesB 2015年

我对格拉德有同样的问题-那是因为我的路径上有JDK 1.7,但是JAVA_HOME指向的是1.8 JDK-谢谢@JamesB
BretC

我遇到了同样的事情,但是我在8u31上
RedDeckWins 2015年

Answers:


137

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

说:

结果,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更为宽容。
杰西·格里克

11
Maven依赖项为:<dependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor-api </ artifactId> <version> 1.2 </ version> </ dependency>
Tim van der Lippe

非常感谢@kozlovda,它解决了问题。很抱歉,检查答案的时间过长-同时正在做一些完全不同的事情,并且找不到时间在旧工作空间中进行验证:-)
Michal Aron 2015年

谢谢@kozlovda,这对您有所帮助:)
Sercan Ozdemir

8
最好将其添加为maven-javadoc-plugin的附加依赖项,因为问题仅取决于javadoc生成过程中的冲突:<additionalDependencies> <additionalDependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor -api </ artifactId> <version> 1.2 </ version> </ additionalDependency> </ additionalDependencies>
lpratlong

49

正如@kozlovda已经提到的那样,问题带有@Transactional注释(javax.transaction.Transactional)。

如果您在针对Spring应用程序的Maven运行中遇到上述错误,则还有另一种方法可以解决该问题:确保不要使用from中的注释javax.transaction,而要使用org.springframework.transaction.annotation.Transactional

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


谢谢!我的一个控制器类的javadoc总是失败,我没有直接看到原因。它是唯一在javax.Transactional上导入的类。
rdhaese

2
谢谢,这是正确的解决方法。如果您正在编写spring应用程序,那么即使spring支持javax EJB transactional,也应该使用spring transactional。而且您不应该将两种不同的事务性混合使用。我在使用javadoc时遇到了同样的问题,并且在导入javax.transactional的数千个类中发现了一个。Javadoc和此注释帮助我找到了真正的错误。
pdenti

这是一个很好的答案,我认为,在大多数情况下都是正确的答案。通常您在春季使用@Transactional,所以误解了注释就很有意义
Phate

12

您还可以将以下行添加到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允许Maven继续构建,但是由于JavaDoc中止,因此不会生成所有文件。例如,可能不会生成所有索引文件。您能认为使用截断的JavaDoc构建成功吗?
马丁·施特劳斯

12

@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
这是IMO的最佳答案,因为在插件配置中添加依赖项可以使该插件明确需要此依赖项。
pyb '18年

5

使用

import org.springframework.transaction.annotation.Transactional;

代替

import javax.transaction.Transactional;

当您在Spring中使用@Transactional时


2

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

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


0

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

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

解决了问题


-4

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

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.