web-dev-qa-db-fra.com

JDK8 - Erreur "fichier de classe pour javax.interceptor.InterceptorBinding introuvable" lors de la tentative de génération de javadoc à l'aide du plugin Maven javadoc

J'utilise JDK8 (essayé sur mon espace de travail Eclipse avec Win x64 u25 JDK + sur Linux lancé par Jenkins - jdk-8u20-linux-x64, le même problème pour les deux).

J'ai un projet multi-module Maven (je lance l'objectif Maven "javadoc: aggreg" à partir d'un module principal dont le type de conditionnement est "pom").

La section de construction Pom ressemble à ceci:

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

Je reçois toujours une erreur:

[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

J'ai tout essayé et essayé de chercher sur Google pendant longtemps, mais sans succès. J'ai trouvé des liens, où les gens avaient des problèmes similaires, mais sans aucune information sur la solution possible:

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

http://mail-archives.Apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (suggérant de mettre à jour JDK8 vers la> mise à jour 20, ce que j'ai fait, mais le problème est toujours le même).

Toute allusion ou quelqu'un a également expérimenté ce type de comportement (malheureusement, il semble être un problème assez "rare" pour une raison quelconque)? Assez désespéré à ce sujet ...

55
Michal Aron

Cela semble être dû au fait que javax.transaction.Transactional (ou toute autre classe de votre chemin de classe) est lui-même annoté avec javax.interceptor.InterceptorBinding, qui est manquant dans le chemin de classe à moins d'être explicitement déclaré dans les dépendances:

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

Dit que:

  • javax.transaction.Transactional - est fourni avec javax.transaction: javax.transaction-api: 1. + (ou org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) et est généralement utilisé dans les applications JPA/ORM/JMS pour annoter les méthodes transactionnelles.
  • javax.interceptor.InterceptorBinding - devrait venir avec javax.interceptor: javax.interceptor-api: 1. + . Mais, bien que déclaré au-dessus de Transactional, il n'est pas requis pour un fonctionnement normal et (semble être ainsi) ne va pas être récupéré en tant que dépendance transitive de votre framework JPA.

Par conséquent, l'outil javadoc JDK8 ne parvient pas à traiter les sources (si certaines d'entre elles sont annotées avec @Transactional).

Bien que cela puisse être plus spécifique sur l'endroit où cette "erreur" a été trouvée.

Correction du problème: l'ajout de la dépendance javax.interceptor:javax.interceptor-api:1.+ corrige le problème.

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>
95
kozlovda

Comme @kozlovda le mentionne déjà, le problème vient avec l'annotation @Transactional (javax.transaction.Transactional).

Si vous avez l'erreur décrite lors d'une exécution Maven pour une application Spring, il existe un autre moyen de résoudre le problème: Assurez-vous de ne pas utiliser l'annotation de javax.transaction, utilisez plutôt org.springframework.transaction.annotation.Transactional.

Remplacer l'importation a corrigé le problème pour moi.

20
Andreas Siegel

Vous pouvez également ajouter la ligne suivante à votre configuration javadoc maven: <failOnError>false</failOnError>. Cela indiquera à l'exécution du javadoc d'ignorer toutes les erreurs et de ne pas laisser la construction échouer.

Votre configuration complète du plug-in javadoc ressemblerait donc à ceci:

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

@lpratlong dit dans une réponse fournie dans un commentaire "l'ajouter comme dépendances supplémentaires de maven-javadoc-plugin". Cela a fonctionné pour moi, voici l'entrée complète du plug-in Maven pour les personnes impatientes comme moi de copier-coller:

        <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 version est commentée car dans mon cas, spring-boot gère la version, restaurez-la au besoin.

6
chrisinmtown

InterceptorBinding est disponible à la dépendance maven suivante:

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

J'ai eu le même problème avec Spring-Boot 2 Kotlin et gradle . Comme @kozlovda l'a suggéré:

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

résolu le problème

0
Oliver Sahner