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 ...
quelle
Antworten:
Dies scheint darauf zurückzuführen zu sein, dass
javax.transaction.Transactional
(oder eine andere Klasse in Ihrem Klassenpfad) selbst mit Anmerkungen versehen istjavax.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. + (oderorg.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 deklariertTransactional
, 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)
quelle
Wie @kozlovda bereits erwähnt, kommt das Problem mit der
@Transactional
Anmerkung (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 verwendenorg.springframework.transaction.annotation.Transactional
.Das Ersetzen des Imports hat das Problem für mich behoben.
quelle
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>
quelle
@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.
quelle
Verwenden
import org.springframework.transaction.annotation.Transactional;
anstatt
import javax.transaction.Transactional;
Wenn Sie @Transactional mit Spring verwenden
quelle
InterceptorBinding ist in folgenden Maven-Abhängigkeiten verfügbar:
<dependency> <groupId>javax.interceptor</groupId> <artifactId>javax.interceptor-api</artifactId> <version>1.2</version> </dependency>
quelle
Ersetzen Sie wie unten
import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class WorkingService
quelle
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
quelle
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>
quelle