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

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

У меня есть многомодульный проект Maven (я запускаю цель Maven «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

Я перепробовал все возможное, долго пытался искать в гугле, но безуспешно. Я нашел ссылки, где у людей были похожие проблемы, но без какой-либо информации о возможном решении:

http://marc.info/?l=maven-user&m=139615350913286&w=2

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (предлагается обновить JDK8 до> обновления 20, что я и сделал, но проблема все та же).

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


person Michal Aron    schedule 06.01.2015    source источник
comment
Вы уверены, что правильно установили 8u20?   -  person JamesB    schedule 07.01.2015
comment
У меня была такая же проблема с GRADLE - это потому, что на моем пути был JDK 1.7, но JAVA_HOME указывал на 1.8 JDK - Спасибо, @JamesB   -  person BretC    schedule 02.02.2015
comment
Я бью то же самое, но нахожусь на 8u31   -  person RedDeckWins    schedule 26.02.2015


Ответы (9)


Похоже, это связано с тем, что 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.

В результате инструмент javadoc JDK8 не может обработать источники (если какие-либо из них помечены знаком @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.2.2 (см. https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api

person kozlovda    schedule 27.02.2015
comment
Да, это решило для меня аналогичную проблему. Кажется, что javadoc JDK 8 требует, чтобы транзитивные зависимости были в пути к классам, тогда как JDK 7 был более снисходительным. - person Jesse Glick; 12.03.2015
comment
Зависимость maven: ‹dependency› ‹groupId› javax.interceptor ‹/groupId› ‹artifactId› javax.interceptor-api ‹/artifactId› ‹version› 1.2 ‹/version› ‹/dependency› - person Tim van der Lippe; 27.05.2015
comment
Большое спасибо, @kozlovda, что решили эту проблему. Извините за долгую задержку с проверкой ответа - тем временем работал над чем-то совершенно другим и не мог найти времени, чтобы проверить это в старой рабочей области :-) - person Michal Aron; 06.11.2015
comment
Спасибо @kozlovda, это очень помогло :) - person Sercan Ozdemir; 28.12.2015
comment
Лучше добавить его в качестве дополнительных зависимостей maven-javadoc-plugin, поскольку проблема связана только с конфликтом во время процесса генерации javadoc: ‹additionalDependencies› ‹additionalDependency› ‹groupId› javax.interceptor ‹/groupId› ‹artifactId› javax.interceptor -api ‹/artifactId› ‹version› 1.2 ‹/version› ‹/additionalDependency› ‹/additionalDependencies› - person lpratlong; 28.03.2017
comment
Разве нет способа исправить это для всех недостающих зависимостей? Я начал добавлять зависимости, но потом продолжаю получать ошибку со следующим, и следующим ... Пока: javax.interceptor-api, javax.ejb, javax.inject, javax.persistence, org .apache.commons.collections ... похоже, бесконечная история ... - person Daniel Rodríguez; 29.03.2017

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

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

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

person Andreas Siegel    schedule 06.07.2016
comment
Спасибо! Документация javadoc для одного из моих классов контроллера всегда терпела неудачу, и я не понимал, почему. Это был единственный класс с импортом в javax.Transactional. - person rdhaese; 12.07.2017
comment
спасибо, это правильное исправление. Если вы пишете приложение Spring, вы должны использовать транзакционный Spring, даже если Spring поддерживает транзакционный javax EJB. И вы не должны смешивать два разных транзакционных. У меня была такая же проблема с javadoc, и я обнаружил, что в одном классе из тысяч я импортировал javax.transactional. Javadoc и этот комментарий помогли мне найти настоящую ошибку. - person pdenti; 09.05.2019
comment
Это отличный ответ и, я думаю, правильный для большинства случаев. Обычно весной вы используете @Transactional, поэтому логично, что вы ошиблись с аннотацией. - person Phate; 10.07.2020

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

person chrisinmtown    schedule 19.12.2017
comment
Это лучший ответ IMO, потому что добавление зависимости внутри конфигурации плагина проясняет, что эта зависимость необходима этому плагину. - person pyb; 01.05.2018
comment
Хорошо, решает только саму проблему. - person Gunnar; 13.01.2021

Вы также можете добавить следующую строку в конфигурацию 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>
person dfme    schedule 07.01.2015
comment
Этот ответ на самом деле не решает проблему, а скорее скрывает ее. failOnError = true позволяет Maven продолжить сборку, но поскольку JavaDoc прерывается, не все файлы создаются. Например, могут быть созданы не все индексные файлы. Можете ли вы считать успешной сборку с усеченными JavaDocs? - person Martín Straus; 05.08.2015

Использовать

import org.springframework.transaction.annotation.Transactional;

вместо

import javax.transaction.Transactional;

когда вы используете @Transactional с Spring

person gfkl    schedule 27.01.2020

InterceptorBinding доступен при следующей зависимости maven:

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>
person Oleksii Kyslytsyn    schedule 22.07.2018

У меня была такая же проблема с Spring-Boot 2 Kotlin и gradle. Как предположил @kozlovda:

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

исправил проблему

person Oliver Sahner    schedule 07.09.2018

Заменить, как показано ниже

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService
person Fred Ondieki    schedule 05.09.2019

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

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
person Ev.Rei.    schedule 28.12.2016