JDK8 - Помилка “файл класу для javax.interceptor.InterceptorBinding не знайдений” при спробі генерувати javadoc за допомогою плагіна Maven javadoc


85

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

У мене є багатомодульний проект Maven (я запускаю ціль 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 до> оновлення 20, що я і зробив, але проблема все ще залишається так само).

Будь-які натяки чи хтось також зазнав подібної поведінки (на жаль, це з якихось причин виглядає як досить "рідкісна" проблема)? Дуже відчайдушно з цього приводу ...


1
Ви впевнені, що правильно встановили 8u20?
— JamesB

У мене була та ж проблема з GRADLE - це тому, що на моєму шляху був JDK 1.7, але JAVA_HOME вказував на 1.8 JDK - Дякую, @JamesB
— BretC 02

Я б'ю те саме, але я на 8u31
— RedDeckWins

Відповіді:


140

Здається, це пов’язано з тим, що 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.

Як результат, інструмент Java JDK8 Java не може обробити джерела (якщо будь-яке з них анотовано @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


2
Так, це вирішило подібну проблему для мене. Здається, javadoc JDK 8 вимагає, щоб перехідні залежності знаходились у шляху до класу, тоді як JDK 7 був більш м’яким.
— Джессі Глік,

11
Залежність maven: <dependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor-api </artifactId> <version> 1.2 </version> </dependency>
— Тім ван дер Ліппе,

Велике спасибі, @kozlovda, це вирішило. Вибачте за довгу затримку з перевіркою відповіді - тим часом працював над чимось зовсім іншим, і не зміг знайти час, щоб перевірити це у старій робочій області :-)
— Michal Aron

Дякую @kozlovda, це дуже допомогло :)
— Серчан Оздемір

8
Краще додати його як додаткові залежності maven-javadoc-plugin, оскільки проблема покладається лише на конфлікт під час процесу генерації javadoc: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor -api </artifactId> <version> 1.2 </version> </additionalDependency> </additionalDependencies>
— lpratlong

51

Як уже згадував @kozlovda, проблема поставляється з @Transactionalанотацією ( javax.transaction.Transactional).

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

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


Дякую! Javadoc для одного з моїх класів контролерів завжди виходив з ладу, і я не бачив прямо, чому. Це був єдиний клас із імпортом на javax.Transactional.
— rdhaese

2
дякую, це правильне виправлення. Якщо ви пишете весняну заявку, ви повинні використовувати пружинну транзакцію, навіть якщо пружина підтримує транзакції javax EJB. І ви не повинні змішувати дві різні транзакції. У мене була та сама проблема з javadoc, і я дізнався, що в одному з тисяч класів я імпортував javax.transactional. Javadoc та цей коментар допомогли мені знайти справжню помилку.
— пденті

Це чудова відповідь і, я думаю, правильна для більшості випадків. Зазвичай ви використовуєте @Transactional навесні, і тому просто має сенс помилково взяти анотацію
— Phate

12

Можна також додати наступний рядок в файл конфігурації Maven JavaDoc: <failOnError>false</failOnError>. Це дозволить виконувати javadoc ігнорувати всі помилки і не дозволяти збірці провалитися.

Тому ваша повна конфігурація плагіна Java виглядає так:

<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 припиняється, генеруються не всі файли. Наприклад, усі файли індексу можуть бути не створені. Чи можете ви вважати збірку із усіченим JavaDocs успішною?
— Мартін Штраус

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

5

Використовуйте

import org.springframework.transaction.annotation.Transactional;

замість

import javax.transaction.Transactional;

коли ви використовуєте @Transactional з Spring


3

InterceptorBinding доступний за таких залежностей від maven:

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

1

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

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

0

У мене була та ж проблема з Spring-Boot 2 Kotlin і gradle. Як запропонував @kozlovda:

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

вирішено проблему


-5

Ви також можете додати залежність Maven до свого файлу POM. Це вирішило цю проблему для мене

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.