JDK8 - Błąd „Nie znaleziono pliku klasy dla javax.interceptor.InterceptorBinding” podczas próby wygenerowania javadoc za pomocą wtyczki Maven javadoc

85

Używam JDK8 (wypróbowałem go na moim obszarze roboczym Eclipse z Win x64 u25 JDK + w systemie Linux uruchomionym przez Jenkins - jdk-8u20-linux-x64, ten sam problem dla obu).

Mam wielomodułowy projekt Mavena (uruchamiam cel Mavena „javadoc: agregat” z głównego modułu z opakowaniem typu „pom”).

Sekcja kompilacji Pom wygląda następująco:

<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>

Zawsze otrzymuję błąd:

[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

Próbowałem wszystkiego, co możliwe i długo szukałem w Google, ale bez sukcesu. Znalazłem linki, w których ludzie mieli podobne problemy, ale bez żadnej informacji o możliwym rozwiązaniu:

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

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (sugeruje zaktualizowanie JDK8 do> aktualizacji 20, co zrobiłem, ale problem nadal to samo).

Jakieś wskazówki lub ktokolwiek też doświadczył tego rodzaju zachowania (niestety z jakiegoś powodu wygląda to na dość „rzadki” problem)? Dość zdesperowany w tej sprawie ...

Michał Aron
źródło
1
Czy na pewno poprawnie zainstalowałeś 8u20?
JamesB
Miałem ten sam problem z GRADLE - to dlatego, że miałem JDK 1.7 na mojej ścieżce, ale JAVA_HOME wskazywał na 1.8 JDK - Dzięki, @JamesB
BretC
Uderzam w to samo, ale jestem na 8u31
RedDeck wygrywa

Odpowiedzi:

140

Wydaje się, że jest to spowodowane tym, że javax.transaction.Transactional(lub jakakolwiek inna klasa w twojej ścieżce klas) jest sama w sobie opatrzona adnotacją javax.interceptor.InterceptorBinding, której brakuje w ścieżce klas, chyba że wyraźnie zadeklarowano to w zależnościach:

@Inherited
@InterceptorBinding // <-- this ONE is causing troubles
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transactional {

Powiedział to:

  • javax.transaction.Transactional- zawiera javax.transaction: javax.transaction-api: 1. + (lub org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) i jest zwykle używany w aplikacjach JPA / ORM / JMS do dodawania adnotacji do metod transakcyjnych.
  • javax.interceptor.InterceptorBinding- powinien zawierać javax.interceptor: javax.interceptor-api: 1. + . Ale, chociaż zadeklarowany Transactional, nie jest wymagany do normalnego działania i (wygląda na to, że z tego powodu) nie jest pobierany jako zależność przechodnia frameworka JPA.

W rezultacie narzędzie javadoc JDK8 nie przetwarza źródeł (jeśli którekolwiek z nich są opatrzone adnotacją @Transactional).

Chociaż może być bardziej szczegółowe określenie miejsca, w którym ten „błąd” został znaleziony.

Poprawka problemu : dodanie javax.interceptor:javax.interceptor-api:1.+zależności rozwiązuje problem.

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

Uwaga (styczeń 2020 r.): Najnowsza (wiarygodna) wersja to obecnie 1.2.2 (patrz https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api

kozlovda
źródło
2
Tak, to rozwiązało u mnie podobny problem. Wydaje się, że javadoc JDK 8 wymaga, aby zależności przechodnie znajdowały się w ścieżce klas, podczas gdy JDK 7 był bardziej wyrozumiały.
Jesse Glick
11
Zależność maven to: <dependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor-api </artifactId> <version> 1.2 </version> </dependency>
Tim van der Lippe
Wielkie dzięki @kozlovda, że ​​to rozwiązało. Przepraszamy za duże opóźnienie w sprawdzaniu odpowiedzi - w międzyczasie pracowałem nad czymś zupełnie innym i nie mogłem znaleźć czasu, aby to zweryfikować w starym obszarze roboczym :-)
Michał Aron
Dziękuję @kozlovda, to bardzo pomogło :)
Sercan Ozdemir
8
Lepiej jest dodać go jako dodatkowe zależności wtyczki maven-javadoc, ponieważ problem polega tylko na konflikcie podczas procesu generowania javadoc: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor -api </artifactId> <version> 1.2 </version> </additionalDependency> </additionalDependencies>
lpratlong
51

Jak już wspomina @kozlovda, problem dotyczy @Transactionaladnotacji ( javax.transaction.Transactional).

Jeśli masz opisany błąd w uruchomieniu Mavena dla aplikacji Spring, istnieje również inny sposób rozwiązania problemu: upewnij się, że nie używasz adnotacji z javax.transaction, zamiast tego użyj org.springframework.transaction.annotation.Transactional.

Zastąpienie importu rozwiązało problem.

Andreas Siegel
źródło
Dzięki! Javadoc dla jednej z moich klas kontrolera zawsze zawodził i nie widziałem bezpośrednio dlaczego. Była to jedyna klasa z importem na javax.Transactional.
rdhaese
2
dzięki, to jest właściwa poprawka. Jeśli piszesz aplikację spring, powinieneś skorzystać z spring transactional, nawet jeśli spring obsługuje javax EJB transactional. I nie powinieneś mieszać dwóch różnych transakcji transakcyjnych. Miałem ten sam problem z javadoc i dowiedziałem się, że w jednej klasie na tysiące zaimportowałem javax.transactional. Javadoc i ten komentarz pomógł mi w znalezieniu prawdziwego błędu.
pdenti
To świetna odpowiedź i, jak sądzę, właściwa w większości przypadków. Zwykle używasz @Transactional wiosną, więc po prostu ma sens, że pomyliłeś adnotację
Phate,
12

Można również dodać następującą linię do konfiguracji maven javadoc: <failOnError>false</failOnError>. To powie programowi javadoc, aby ignorował wszystkie błędy i nie pozwolił na niepowodzenie kompilacji.

Twoja pełna konfiguracja wtyczki javadoc wyglądałaby więc następująco:

<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>
dfme
źródło
6
Ta odpowiedź w rzeczywistości nie rozwiązuje problemu, a raczej go ukrywa. failOnError = true pozwala Mavenowi kontynuować budowanie, ale ponieważ JavaDoc przerywa pracę, nie wszystkie pliki są generowane. Na przykład wszystkie pliki indeksowe mogą nie zostać wygenerowane. Czy możesz uznać kompilację z obciętymi dokumentami JavaDocs za udaną?
Martín Straus
12

@lpratlong mówi w odpowiedzi zawartej w komentarzu "dodaj to jako dodatkowe zależności maven-javadoc-plugin". To zadziałało dla mnie, oto pełny wpis wtyczki Maven dla niecierpliwych ludzi, takich jak ja, do kopiowania i wklejania:

        <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>

Wersja jest zakomentowana, ponieważ w moim przypadku spring-boot zarządza wersją, po prostu przywróć w razie potrzeby.

chrisinmtown
źródło
1
Jest to najlepsza odpowiedź IMO, ponieważ dodanie zależności w konfiguracji wtyczki wyjaśnia, że ​​ta zależność jest potrzebna tej wtyczce.
pyb
5

Posługiwać się

import org.springframework.transaction.annotation.Transactional;

zamiast

import javax.transaction.Transactional;

kiedy korzystasz z @Transactional w Spring

gfkl
źródło
2

InterceptorBinding jest dostępny w następującej zależności maven:

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>
Oleksii Kyslytsyn
źródło
1

Wymień jak poniżej

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService
Fred Ondieki
źródło
0

Miałem ten sam problem z Spring-Boot 2 Kotlin i gradle. Jak zasugerował @kozlovda:

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

naprawiono problem

Oliver Sahner
źródło
-5

Możesz również dodać zależność Mavena do pliku POM. Rozwiązało to dla mnie ten problem

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
Ev.Rei.
źródło