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.