JDK8 - Error "archivo de clase para javax.interceptor.InterceptorBinding no encontrado" al intentar generar javadoc utilizando el complemento javadoc de Maven

82

Estoy usando JDK8 (lo probé en mi espacio de trabajo de Eclipse con Win x64 u25 JDK + en Linux lanzado por Jenkins - jdk-8u20-linux-x64, el mismo problema para ambos).

Tengo un proyecto Maven de varios módulos (estoy lanzando el objetivo de Maven "javadoc: aggregate" desde un módulo principal con el tipo de paquete "pom").

La sección de construcción de Pom se ve así:

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

Siempre recibo error:

[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

He intentado todo lo posible y he intentado buscar en Google durante mucho tiempo, pero sin éxito. Encontré enlaces, donde la gente tuvo problemas similares, pero sin ninguna información sobre una posible solución:

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

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (sugiriendo actualizar JDK8 a> actualización 20, lo cual hice, pero el problema sigue siendo lo mismo).

¿Alguna sugerencia o alguien experimentó este tipo de comportamiento también (desafortunadamente, parece un problema bastante "raro" por alguna razón)? Bastante desesperado por esto ...

Michal Aron
fuente
1
¿Está seguro de que instaló 8u20 correctamente?
JamesB
Tuve el mismo problema con GRADLE - fue porque tenía JDK 1.7 en mi camino pero JAVA_HOME apuntaba a un 1.8 JDK - Gracias, @JamesB
BretC
Estoy golpeando lo mismo pero estoy en 8u31
RedDeckWins

Respuestas:

137

Esto parece deberse a que javax.transaction.Transactional(o cualquier otra clase en su classpath para el caso) está anotado con javax.interceptor.InterceptorBinding, que falta en classpath a menos que se declare explícitamente en las dependencias:

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

Dijo eso:

  • javax.transaction.Transactional- viene con javax.transaction: javax.transaction-api: 1. + (o org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) y se usa normalmente en aplicaciones JPA / ORM / JMS para anotar métodos transaccionales.
  • javax.interceptor.InterceptorBinding- debería venir con javax.interceptor: javax.interceptor-api: 1. + . Pero, aunque se declara por encima de Transactional, no es necesario para el funcionamiento normal y (parece que debido a esto) no se busca como una dependencia transitiva de su marco JPA.

Como resultado, la herramienta JDK8 javadoc no procesa las fuentes (si alguna de ellas tiene anotaciones @Transactional).

Aunque podría ser más específico sobre el lugar donde se ha encontrado este "error".

Solución del problema : agregar javax.interceptor:javax.interceptor-api:1.+dependencia soluciona el problema.

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

Nota (enero de 2020): la última versión (plausible) es actualmente 1.2.2 (consulte https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api

kozlovda
fuente
2
Sí, esto me resolvió un problema similar. Parece que el javadoc de JDK 8 requiere que las dependencias transitivas estén en la ruta de clases, mientras que JDK 7 fue más indulgente.
Jesse Glick
11
La dependencia de maven es: <dependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor-api </artifactId> <version> 1.2 </version> </dependency>
Tim van der Lippe
Muchas gracias, @kozlovda, eso lo resolvió. Perdón por la gran demora en verificar la respuesta; mientras tanto, estaba trabajando en algo completamente diferente y no pude encontrar tiempo para verificar esto en el espacio de trabajo anterior :-)
Michal Aron
Gracias @kozlovda, esto ayudó mucho :)
Sercan Ozdemir
8
Es mejor agregarlo como dependencias adicionales de maven-javadoc-plugin ya que el problema se basa solo en un conflicto durante el proceso de generación de javadoc: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor -api </artifactId> <version> 1.2 </version> </additionalDependency> </additionalDependencies>
lpratlong
49

Como ya menciona @kozlovda, el problema viene con la @Transactionalanotación ( javax.transaction.Transactional).

Si tiene el error descrito en una ejecución de Maven para una aplicación Spring, también hay otra forma de resolver el problema: asegúrese de no usar la anotación de javax.transaction, en su lugar use org.springframework.transaction.annotation.Transactional.

Reemplazar la importación solucionó el problema para mí.

Andreas Siegel
fuente
¡Gracias! El javadoc para una de mis clases de controlador siempre fallaba y no vi directamente por qué. Fue la única clase con una importación en javax.Transactional.
rdhaese
2
gracias, esta es la solución correcta. Si está escribiendo una aplicación de Spring, se supone que debe usar Spring Transaccional, incluso si Spring admite javax EJB Transaccional. Y no se supone que debe mezclar los dos Transactional diferentes. Tuve el mismo problema con javadoc y descubrí en una de las miles que tenía javax.transactional importado. Javadoc y este comentario me ayudaron a encontrar el verdadero error.
pdenti
Esta es una gran respuesta y, creo, la correcta para la mayoría de los casos. Por lo general, está usando @Transactional en primavera, por lo que tiene sentido que haya confundido la anotación
Phate
12

También puede añadir la siguiente línea a su configuración experta javadoc: <failOnError>false</failOnError>. Esto le dirá a la ejecución de javadoc que ignore todos los errores y no deje que la compilación falle.

Por lo tanto, la configuración completa del complemento javadoc se vería así:

<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
fuente
6
Esta respuesta en realidad no aborda el problema, sino que lo oculta. failOnError = true permite que Maven continúe con la compilación, pero dado que JavaDoc aborta, no se generan todos los archivos. Por ejemplo, es posible que no se generen todos los archivos de índice. ¿Puede considerar una compilación con JavaDocs truncados como exitosa?
Martín Straus
12

@lpratlong dice en una respuesta proporcionada en un comentario "agréguelo como dependencias adicionales de maven-javadoc-plugin". Eso funcionó para mí, aquí está la entrada completa del complemento Maven para que la gente impaciente como yo copie y pegue:

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

La versión está comentada porque, en mi caso, spring-boot administra la versión, solo restaure según sea necesario.

chrisinmtown
fuente
1
Esta es la mejor respuesta, en mi opinión, porque agregar la dependencia dentro de la configuración del complemento deja en claro que ese complemento necesita esta dependencia.
Pyb
5

Utilizar

import org.springframework.transaction.annotation.Transactional;

en vez de

import javax.transaction.Transactional;

cuando usa @Transactional con Spring

gfkl
fuente
2

InterceptorBinding está disponible en la siguiente dependencia de maven:

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

Reemplazar como se muestra a continuación

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService
Fred Ondieki
fuente
0

Tuve el mismo problema con Spring-Boot 2 Kotlin y gradle. Como sugirió @kozlovda:

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

solucionó el problema

Oliver Sahner
fuente
-4

También puede agregar la dependencia de Maven a su archivo POM. Me resolvió este problema

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