JDK8 - Fehler "Klassendatei für javax.interceptor.InterceptorBinding nicht gefunden" beim Versuch, Javadoc mit dem Maven-Javadoc-Plugin zu generieren

82

Ich verwende JDK8 (habe es in meinem Eclipse-Arbeitsbereich mit Win x64 u25 JDK + unter Linux versucht, das von Jenkins gestartet wurde - jdk-8u20-linux-x64, dasselbe Problem für beide).

Ich habe ein Maven-Projekt mit mehreren Modulen (ich starte das Maven-Ziel "javadoc: aggregat" von einem Hauptmodul mit dem Verpackungstyp "pom").

Der Pom-Build-Abschnitt sieht folgendermaßen aus:

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

Ich erhalte immer Fehler:

[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

Ich habe alles Mögliche versucht und lange versucht, bei Google zu suchen, aber keinen Erfolg. Ich habe Links gefunden, bei denen Leute ähnliche Probleme hatten, aber ohne Informationen über mögliche Lösungen:

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

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (Vorschlag, JDK8 auf> Update 20 zu aktualisieren, was ich getan habe, aber das Problem ist immer noch das Gleiche).

Irgendwelche Hinweise oder jemand hat diese Art von Verhalten auch erlebt (leider sieht es aus irgendeinem Grund als ziemlich "seltenes" Problem aus)? Ziemlich verzweifelt darüber ...

Michal Aron
quelle
1
Sind Sie sicher, dass Sie 8u20 richtig installiert haben?
JamesB
Ich hatte das gleiche Problem mit GRADLE - es war, weil ich JDK 1.7 auf meinem Weg hatte, aber JAVA_HOME zeigte auf ein 1.8 JDK - Danke, @JamesB
BretC
Ich treffe das gleiche, aber ich bin auf 8u31
RedDeckWins

Antworten:

137

Dies scheint darauf zurückzuführen zu sein, dass javax.transaction.Transactional(oder eine andere Klasse in Ihrem Klassenpfad) selbst mit Anmerkungen versehen ist javax.interceptor.InterceptorBinding, die im Klassenpfad fehlen, sofern dies nicht ausdrücklich in Abhängigkeiten deklariert ist:

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

Sagte, dass:

  • javax.transaction.Transactional- wird mit javax.transaction: javax.transaction-api: 1. + (oder org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) geliefert und wird normalerweise in JPA / ORM / JMS-Apps zum Kommentieren von Transaktionsmethoden verwendet.
  • javax.interceptor.InterceptorBinding- sollte mit javax.interceptor: javax.interceptor-api: 1. + kommen . Obwohl oben deklariert Transactional, ist dies für den normalen Betrieb nicht erforderlich und wird (aus diesem Grund) nicht als transitive Abhängigkeit Ihres JPA-Frameworks abgerufen.

Infolgedessen kann das JDK8-Javadoc-Tool die Quellen nicht verarbeiten (wenn eine davon mit Anmerkungen versehen ist @Transactional).

Obwohl es genauer sein könnte, wo dieser "Fehler" gefunden wurde.

Problembehebung : Durch Hinzufügen von javax.interceptor:javax.interceptor-api:1.+Abhängigkeiten wird das Problem behoben.

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

Hinweis (Januar 2020): Die neueste (plausible) Version ist derzeit 1.2.2 (siehe https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api)

kozlovda
quelle
2
Ja, dies hat ein ähnliches Problem für mich gelöst. Das Javadoc von JDK 8 erfordert, dass sich transitive Abhängigkeiten im Klassenpfad befinden, während JDK 7 milder war.
Jesse Glick
11
Die Maven-Abhängigkeit lautet: <dependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor-api </ifactId> <version> 1.2 </ version> </ dependency>
Tim van der Lippe
Vielen Dank, @kozlovda, das hat es gelöst. Entschuldigung für die lange Verzögerung beim Überprüfen der Antwort - arbeitete in der Zwischenzeit an etwas völlig anderem und fand keine Zeit, dies im alten Arbeitsbereich zu überprüfen :-)
Michal Aron
Vielen Dank @kozlovda das hat sehr geholfen :)
Sercan Ozdemir
8
Es ist besser, es als zusätzliche Abhängigkeiten des maven-javadoc-Plugins hinzuzufügen, da das Problem nur in einem Konflikt während des Javadoc-Generierungsprozesses beruht: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor -api </ Artefakt-ID> <Version> 1.2 </ Version> </ zusätzliche
Abhängigkeit
49

Wie @kozlovda bereits erwähnt, kommt das Problem mit der @TransactionalAnmerkung (javax.transaction.Transactional ).

Wenn Sie den beschriebenen Fehler bei einem Maven-Lauf für eine Spring-Anwendung haben, gibt es auch eine andere Möglichkeit, das Problem zu beheben: Stellen Sie sicher, dass Sie die Anmerkung von nicht verwenden javax.transaction, sondern verwenden org.springframework.transaction.annotation.Transactional.

Das Ersetzen des Imports hat das Problem für mich behoben.

Andreas Siegel
quelle
Vielen Dank! Das Javadoc für eine meiner Controller-Klassen ist immer fehlgeschlagen und ich habe nicht direkt gesehen, warum. Es war die einzige Klasse mit einem Import auf javax.Transactional.
Rdhaese
2
Danke, das ist die richtige Lösung. Wenn Sie eine Federanwendung schreiben, sollten Sie Spring Transactional verwenden, auch wenn Spring Javax EJB Transactional unterstützt. Und Sie sollten die beiden verschiedenen Transaktionen nicht mischen. Ich hatte das gleiche Problem mit Javadoc und fand in einer von Tausenden Klassen heraus, dass ich javax.transactional importiert hatte. Javadoc und dieser Kommentar haben mir geholfen, den wahren Fehler zu finden.
pdenti
Dies ist eine großartige Antwort und meiner Meinung nach die richtige für die meisten Fälle. Normalerweise verwenden Sie @Transactional im Frühjahr und daher ist es nur sinnvoll, dass Sie die Anmerkung
falsch
12

Sie können Ihrer Javadoc-Maven-Konfiguration auch die folgende Zeile hinzufügen: <failOnError>false</failOnError> . Dadurch wird die Javadoc-Ausführung angewiesen, alle Fehler zu ignorieren und den Build nicht fehlschlagen zu lassen.

Ihre vollständige Javadoc-Plugin-Konfiguration würde daher folgendermaßen aussehen:

<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
quelle
6
Diese Antwort spricht das Problem nicht an, sondern verbirgt es. Mit failOnError = true kann Maven den Build fortsetzen. Da JavaDoc jedoch abgebrochen wird, werden nicht alle Dateien generiert. Beispielsweise werden möglicherweise nicht alle Indexdateien generiert. Können Sie einen Build mit abgeschnittenen JavaDocs als erfolgreich betrachten?
Martín Straus
12

@lpratlong sagt in einer Antwort in einem Kommentar "füge es als zusätzliche Abhängigkeit des Maven-Javadoc-Plugins hinzu". Das hat bei mir funktioniert, hier ist der vollständige Maven-Plugin-Eintrag für ungeduldige Leute wie mich zum Kopieren und Einfügen:

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

Die Version ist auskommentiert, da in meinem Fall Spring-Boot die Version verwaltet. Stellen Sie sie einfach nach Bedarf wieder her.

chrisinmtown
quelle
1
Dies ist IMO die beste Antwort, da durch Hinzufügen der Abhängigkeit innerhalb der Plugin-Konfiguration deutlich wird, dass diese Abhängigkeit von diesem Plugin benötigt wird.
Pyb
5

Verwenden

import org.springframework.transaction.annotation.Transactional;

anstatt

import javax.transaction.Transactional;

Wenn Sie @Transactional mit Spring verwenden

gfkl
quelle
2

InterceptorBinding ist in folgenden Maven-Abhängigkeiten verfügbar:

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>
Oleksii Kyslytsyn
quelle
1

Ersetzen Sie wie unten

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService
Fred Ondieki
quelle
0

Ich hatte das gleiche Problem mit Spring-Boot 2 Kotlin und Gradle. Wie @kozlovda vorschlug:

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

Das Problem wurde behoben

Oliver Sahner
quelle
-4

Sie können Ihrer POM-Datei auch eine Maven-Abhängigkeit hinzufügen. Es hat dieses Problem für mich gelöst

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