11 votes

L'utilisation du compilateur Eclipse au lieu de javac entraîne un crash de javadoc

Résumé :

J'ai rencontré un problème intéressant, et je ne sais pas vraiment comment le résoudre :

  • Notre projet se construit bien depuis des mois
  • J'ai changé le maven-compiler-plugin pour utiliser le eclipse au lieu du compilateur javac
  • Maintenant, quand je lance mvn site , maven-javadoc-plugin échoue
  • D'après la trace de la pile, il semble que l'outil Javadoc se bloque sur un fichier de classe créé par le compilateur Eclipse.

Y a-t-il un moyen de résoudre ce problème ? Si ce n'est pas le cas, y a-t-il au moins un moyen de le déboguer davantage ?

Tous les détails :

J'utilise Java 1.6.0_27 et Maven 3.0.2.

J'ai utilisé le compilateur javac pour construire notre base de code, mais j'aimerais essayer le compilateur Eclipse, car il produit de bien meilleurs avertissements (et est plus configurable à d'autres égards).

J'ai donc modifié la définition de la maven-compiler-plugin dans le pom.xml :

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <compilerId>eclipse</compilerId>
        <source>1.6</source>
        <target>1.6</target>
        <compilerArgument>-warn:+boxing,enumSwitch,javadoc,hashCode</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-eclipse</artifactId>
            <version>1.8.2</version>
        </dependency>
    </dependencies>
</plugin>

Dans mon <reporting> section, je l'ai fait :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.8</version>
</plugin>

Jusqu'à présent, tout va bien. J'ai fait un mvn clean install et tout se construit bien, tous les tests passent, et tout semble parfait.

Mais quand j'essaie d'exécuter mvn site Mais lorsqu'il arrive au rapport Javadoc, il échoue avec ce qui semble être un crash Javadoc :

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) on project framework: Error during page generation: Error rendering Maven report:
[ERROR] Exit code: 1 - java.lang.StringIndexOutOfBoundsException: String index out of range: -15
[ERROR] at java.lang.String.substring(String.java:1937)
[ERROR] at java.lang.String.substring(String.java:1904)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.simpleBinaryName(ClassReader.java:958)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readEnclosingMethodAttr(ClassReader.java:930)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readMemberAttr(ClassReader.java:909)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassAttr(ClassReader.java:1053)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassAttrs(ClassReader.java:1067)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:1560)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:1658)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1845)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777)
[ERROR] at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
[ERROR] at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)
[ERROR] at com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:695)
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.getFlags(ClassDocImpl.java:105)
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.isAnnotationType(ClassDocImpl.java:116)
[ERROR] at com.sun.tools.javadoc.DocEnv.isAnnotationType(DocEnv.java:574)
[ERROR] at com.sun.tools.javadoc.DocEnv.getClassDoc(DocEnv.java:546)
[ERROR] at com.sun.tools.javadoc.PackageDocImpl.getClasses(PackageDocImpl.java:154)
[ERROR] at com.sun.tools.javadoc.PackageDocImpl.addAllClassesTo(PackageDocImpl.java:170)
[ERROR] at com.sun.tools.javadoc.RootDocImpl.classes(RootDocImpl.java:178)
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:96)
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64)
[ERROR] at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42)
[ERROR] at com.sun.tools.doclets.standard.Standard.start(Standard.java:23)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[ERROR] at java.lang.reflect.Method.invoke(Method.java:597)
[ERROR] at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:269)
[ERROR] at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:143)
[ERROR] at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340)
[ERROR] at com.sun.tools.javadoc.Start.begin(Start.java:128)
[ERROR] at com.sun.tools.javadoc.Main.execute(Main.java:41)
[ERROR] at com.sun.tools.javadoc.Main.main(Main.java:31)
[ERROR] 
[ERROR] Command line was: "C:\Program Files (x86)\Java\jdk1.6.0_27\jre\..\bin\javadoc.exe" @options @packages
[ERROR] 
[ERROR] Refer to the generated Javadoc files in 'C:\Projects\SMF\framework\target\site\apidocs' dir.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Ma question :

OK, alors qu'est-ce qui a changé ? Tout le Javadoc et le site Maven se construisaient très bien lorsque j'utilisais javac, mais dès que je suis passé au compilateur Eclipse, Javadoc se plante.

Pire, il ne me dit même pas quelle classe a provoqué le plantage, je ne sais donc pas par où commencer le débogage.

Évidemment, pour l'instant, cela signifie que je ne vais pas utiliser le compilateur Eclipse et que je vais m'en tenir à javac. Mais je suis curieux de savoir pourquoi ce qui se passe, et ce que je pourrais faire pour le réparer ou le contourner.

3voto

Daniel Pryden Points 22167

J'ai enfin eu le temps de me pencher à nouveau sur la question. Le site maven-javadoc-plugin laisse utilement derrière lui un javadoc.bat scriptsous target/site/apidocs lorsque le javadoc.exe échoue, et j'ai pu trouver le paquet incriminé en élaguant la liste dans le fichier d'aide. packages qui est passé dans javadoc.exe .

Il est intéressant de noter que le code problématique s'est avéré être la source Java générée par l'outil de gestion de l'environnement. Tampons du protocole Google compilateur. C'est une chance, car il est acceptable de simplement exclure la source générée par protobuf de la Javadoc entièrement.

J'ai ajouté la définition suivante, sous mes deux <build> y <reporting> des sections du POM, et cela a résolu mon problème :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.6.1</version>
    <configuration>
        <excludePackageNames>com.mycompany.myproject.proto</excludePackageNames>
    </configuration>
</plugin>

2voto

Funtik Points 3472

La solution consiste à créer un profil distinct pour l'objectif du site. Ainsi, vous pourriez définir différents compilateurs pour différents objectifs.

1voto

Kelly S. French Points 7634

Peut-être que le javadoc.exe n'utilise pas le même JRE que celui utilisé par Eclipse. Y a-t-il d'autres JRE installés ? Essayez d'exécuter manuellement le processus javadoc.exe et voyez s'il fait la même chose, vous obtiendrez peut-être la trace de la pile du problème.

0voto

Daniel Baktiar Points 1232

Ce n'est peut-être pas une réponse, mais je propose juste une idée.

Que diriez-vous d'installer le JDK dans le dossier sans espace (j'ai vu qu'il est C:\Program Files (x86)...). Java supporte les espaces dans les noms de fichiers, mais probablement certains des plugins/outils/bibliothèques que javadoc utilise ne le supportent pas.

0voto

Andrew Koroluk Points 545

Je suppose que le problème est que javac et eclipse utilisent des versions différentes du JDK pour compiler votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X