JDK8-ошибка "файл класса для javax.перехватчик.InterceptorBinding не найден" при попытке создать javadoc с помощью плагина Maven javadoc

Я использую JDK8 (пробовал его на моем рабочем пространстве Eclipse с Win x64 u25 JDK + на Linux, запущенном Jenkins - jdk-8u20-linux-x64, та же проблема для обоих).

у меня есть многомодульный проект Maven (я запускаю Maven goal "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, что я и сделал, но проблема все та же).

любые подсказки или кто-либо испытал такое поведение (к сожалению, по какой-то причине оно выглядит как довольно "редкая" проблема)? Совсем отчаялся...

7 ответов


это, по-видимому, связано с 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.+ зависимость устраняет проблему.


как уже упоминает @kozlovda, проблема связана с @Transactional аннотация (javax.transaction.Transactional).

если у вас есть описанная ошибка при запуске Maven для приложения Spring, существует также другой способ решить эту проблему: Не используйте аннотацию из javax.transaction, вместо того, чтобы использовать org.springframework.transaction.annotation.Transactional.

замена импорта исправила проблему для меня.


вы также можете добавить следующую строку в конфигурацию 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>

@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 управляет версией, просто восстанавливает по мере необходимости.


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.+'
  ...

Исправлена проблема


вы также можете добавить зависимость Maven в файл POM. Это решило эту проблему для меня

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>