JDK8 – Erreur “fichier de classe pour javax.interceptor.InterceptorBinding non trouvé” 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, même problème pour les deux).

J’ai un projet multi-module Maven (je lance l’objective Maven “javadoc: aggregated” à partir d’un module principal avec le type de packaging “pom”).

La section de construction Pom ressemble à ceci:

   org.apache.maven.plugins maven-comstackr-plugin  1.8 1.8    org.apache.maven.plugins maven-javadoc-plugin  -Xdoclint:none     

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 depuis longtemps, mais sans succès. J’ai trouvé des liens, où les gens avaient des problèmes similaires, mais sans aucune information sur les solutions possibles:

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

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%3C54101E24.6060304@gmx.de%3E (suggérant de mettre à jour JDK8 pour> mettre à jour 20, ce que j’ai fait, mais le problème est toujours présent) le même).

Des astuces ou quelqu’un a-t-il expérimenté ce genre de comportement (malheureusement, cela semble être un problème assez “rare” pour une raison quelconque)? Tout à fait désespéré à ce sujet …

    Cela semble être dû au fait que javax.transaction.Transactional (ou toute autre classe de votre classpath) est lui-même annoté avec javax.interceptor.InterceptorBinding , qui est manquant dans classpath sauf déclaration explicite 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 livré 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ée au-dessus de Transactional , n'est pas nécessaire pour le fonctionnement normal et (ressemble à ceci) ne sera pas récupéré comme une dépendance transitive de votre framework JPA.

    Par conséquent, l'outil jadadoc JDK8 ne parvient pas à traiter les sources (si l'une d'elles est annotée avec @Transactional ).

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

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

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

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

    Le remplacement de l’importation a résolu le problème pour moi.

    Vous pouvez aussi append la ligne suivante à votre configuration javadoc maven: false . Cela indiquera à l’exécution javadoc d’ignorer toutes les erreurs et de ne pas laisser la construction échouer.

    Votre configuration complète de plugin javadoc ressemblerait donc à ceci:

        org.apache.maven.plugins maven-comstackr-plugin  1.8 1.8    org.apache.maven.plugins maven-javadoc-plugin  -Xdoclint:none false     

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

       org.apache.maven.plugins maven-javadoc-plugin      javax.interceptor javax.interceptor-api 1.2     

    La version est commentée car dans mon cas, Spring-Boot gère la version, il suffit de la restaurer si nécessaire.

    InterceptorBinding est disponible pour les dépendances suivantes:

      javax.interceptor javax.interceptor-api 1.2  

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

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

    résolu le problème

    Vous pouvez également append une dépendance Maven à votre fichier POM. Il a résolu ce problème pour moi

       net.sourceforge.cobertura cobertura 2.1.1 comstack