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>