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 {
говорит, что:
- 
javax.transaction.TransactionalС javax.сделки:класса javax.транзакция-api: 1.+ (илиorg.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) и обычно используется в приложениях JPA/ORM/JMS для аннотирования транзакционных методов.
- 
javax.interceptor.InterceptorBinding- должен прийти с javax.перехватчик:класса javax.перехватчик-API-интерфейса:1.+. Но, хотя объявлено поверхTransactional, не требуется для нормальной работы и (похоже, из-за этого) не извлекается как транзитивная зависимость вашей структуры JPA.
в результате инструмент 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>
