Me encontré con un problema interesante y no estoy muy seguro de cómo detectarlo:
maven-compiler-plugin
para usar el eclipse
compilador en lugar dejavac
mvn site
, maven-javadoc-plugin
falla¿Hay alguna forma de arreglar esto? Si no es así, ¿hay al menos alguna forma de depurarlo más?
Estoy usando Java 1.6.0_27 y Maven 3.0.2.
He estado usando el compilador javac para construir nuestro código base, pero estoy interesado en probar el compilador Eclipse, ya que produce advertencias mucho mejores (y es más configurable de otras formas).
Así que cambié la definición de maven-compiler-plugin
en el pom.xml a:
<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>
En mi <reporting>
sección, tengo:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8</version>
</plugin>
Hasta aquí todo bien. Hice una mvn clean install
y todo va bien, todas las pruebas pasan y todo se ve muy bien.
Pero cuando trato de ejecutar mvn site
, cuando llega al informe de Javadoc, falla con lo que parece ser un bloqueo de 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
OK, ¿entonces qué cambió? Todo el Javadoc y el sitio de Maven se estaban construyendo bien cuando estaba usando javac, pero tan pronto como cambié al compilador de Eclipse, Javadoc falla.
Peor aún, ni siquiera me dice qué clase hizo que se bloqueara, así que ni siquiera sé por dónde empezar a depurar esto.
Obviamente, por el momento, esto significa que no voy a usar el compilador de Eclipse, sino que me quedaré con javac. Pero tengo curiosidad por saber por qué está sucediendo esto y qué podría hacer para solucionarlo o solucionarlo.
Finalmente tuve algo de tiempo para investigar esto nuevamente. El maven-javadoc-plugin
útilmente deja atrás un javadoc.bat
script debajo target/site/apidocs
cuando el javadoc.exe
proceso falla, y pude encontrar el paquete ofensivo podando la lista en el packages
archivo que se pasa javadoc.exe
.
Curiosamente, el código problemático resultó ser la fuente de Java generada por el compilador Google Protocol Buffers . Esto fue una suerte, ya que es aceptable simplemente excluir por completo la fuente generada por protobuf del Javadoc.
Agregué la siguiente definición, tanto en mi <build>
como en las <reporting>
secciones del POM, y esto resolvió mi problema:
<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>
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras