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 ...
źródło
Odpowiedzi:
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. + (luborg.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ż zadeklarowanyTransactional
, 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
źródło
Jak już wspomina @kozlovda, problem dotyczy
@Transactional
adnotacji (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żyjorg.springframework.transaction.annotation.Transactional
.Zastąpienie importu rozwiązało problem.
źródło
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>
źródło
@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.
źródło
Posługiwać się
import org.springframework.transaction.annotation.Transactional;
zamiast
import javax.transaction.Transactional;
kiedy korzystasz z @Transactional w Spring
źródło
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>
źródło
Wymień jak poniżej
import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class WorkingService
źródło
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
źródło
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>
źródło