while Maven no está funcionando en Java 8 cuando las etiquetas Javadoc están incompletas




mavenreportexception error while generating javadoc (14)

El enfoque más fácil para que las cosas funcionen con java 8 y java 7 es usar un perfil en la compilación:

<profiles>
  <profile>
    <id>doclint-java8-disable</id>
    <activation>
      <jdk>[1.8,)</jdk>
    </activation>

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <configuration>
            <additionalparam>-Xdoclint:none</additionalparam>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

Desde que uso Maven, he podido construir e instalar en mis proyectos de repositorio local que tienen etiquetas Javadoc incompletas (por ejemplo, un parámetro que falta).

Sin embargo, ya que migré a Java 8 (1.8.0-ea-b90), Maven es absolutamente estricto con las etiquetas de documentación faltantes y me muestra muchos errores de Javadoc relacionados con los problemas de Javadoc cuando intento compilar o instalar un proyecto en el que no está "Perfecto". Algunos de los proyectos que estoy tratando de compilar e instalar en mi repositorio local son proyectos de terceros de los que no tengo control. Por lo tanto, la solución para corregir todos los Javadocs en todos estos proyectos no parece ser factible en mi escenario.

Esta es una pequeña parte de la salida que veo cuando mvn clean package install en mi proyecto:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.026s
[INFO] Finished at: Mon Apr 08 21:06:17 CEST 2013
[INFO] Final Memory: 27M/437M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.9:jar (attach-javadocs) on project jpc: MavenReportException: Error while creating archive:
[ERROR] Exit code: 1 - /Users/sergioc/Documents/workspaces/heal/jpc/src/main/java/org/jpc/engine/prolog/PrologDatabase.java:10: error: @param name not found
[ERROR] * @param terms the terms to assert
[ERROR] ^
[ERROR] /Users/sergioc/Documents/workspaces/heal/jpc/src/main/java/org/jpc/engine/prolog/PrologDatabase.java:11: warning: no description for @return
[ERROR] * @return
[ERROR] ^

El complemento Javadoc Maven está configurado así en mi POM:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Como dije antes, todo funciona bien si vuelvo a Java 7. ¿Es posible que este sea un error relacionado con el funcionamiento de Maven en Java 8? ¿Cómo podría hacerlo funcionar (es decir, poder construir el Javadoc del proyecto e instalar su código en mi repositorio local) con Java 8? He probado tanto con Maven 3.0.3 como con 3.0.5 en OSX.

ACTUALIZAR:

Si cambio la configuración de mi complemento Javadoc con <failOnError>false</failOnError> (gracias Martin):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Entonces el proyecto se instala en mi repositorio local. Sin embargo, el JAR Javadoc todavía no se genera.

Un fragmento de la salida que veo en la consola con esta nueva configuración es:

[ERROR] MavenReportException: Error al crear el archivo: Código de salida: 1 - /Users/....java:18: advertencia: no @param ... La línea de comando era: / Library / Java / Home / bin / javadoc @options @paquetes

Consulte los archivos Javadoc generados en '/ Users / sergioc / Documents / workspaces / heal / minitoolbox / target / apidocs' dir.

at org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeJavadocCommandLine (AbstractJavadocMojo.java:5043) en las costillas de la mano por lo que corresponda. .javadoc.JavadocJar.execute (JavadocJar.java:181) en org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPlugin. : 209) en org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:153) en org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:145) en org.apache. maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:84) en la página org.apache.maven.lifecycle. singleThreadedBuild (LifecycleStarter.java:183) en org.apache.maven.lifecycle.internal.Lifecyc leStarter.execute (LifecycleStarter.java:161) en org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:320) en org.apache.maven.DefaultMaven.execute (DefaultMaven.java.156) en org.apache.maven .cli.MavenCli.execute (MavenCli.java:537) en org.apache.maven.cli.MavenCli.doMain (MavenCli.java:196) en org.apache.maven.cli.MavenCli.main (MavenCli.java:141 ) en sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo), y / o en la parte correspondiente de la organización. Method.invoke (Method.java:491) en org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:290) en org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java: 230) en org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:409) en org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:352)

¿Alguna solución alternativa sobre cómo construir las fuentes, instalar el proyecto y generar el JAR Javadoc en un solo paso mientras trabajaba con Java 7?


Me gustaría añadir algunas ideas sobre otras respuestas.

En mi caso

-Xdoclint: ninguno

No funciono

Empecemos con eso, en mi proyecto, realmente no necesitaba javadoc en absoluto. Sólo algunos complementos necesarios tenían una dependencia de tiempo de compilación en ello.

Entonces, la forma más sencilla de resolver mi problema fue:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

No creo que el solo hecho de desactivar DocLint sea una buena solución, al menos no a largo plazo. Es bueno que Javadoc se haya vuelto un poco más estricto, por lo que la forma correcta de solucionar el problema de construcción es solucionar el problema subyacente . Sí, en última instancia, necesitarás arreglar esos archivos de código fuente.

Estas son las cosas a tener en cuenta para las que previamente podría salirse con la suya:

  • HTML con formato incorrecto (por ejemplo, una etiqueta final que falta, corchetes sin escape, etc.)
  • Invalid {@link } s. (Lo mismo ocurre con etiquetas similares, como @see )
  • Valores de @author no @author . Esto solía ser aceptado: @author John <[email protected]> pero ya no tanto debido a los corchetes sin escape.
  • Las tablas HTML en Javadoc ahora requieren un resumen o título. Vea esta pregunta para una explicación.

Simplemente tendrás que arreglar tus archivos de código fuente y seguir construyendo tu Javadoc hasta que pueda compilarse sin fallar. Incómodo, sí, pero personalmente me gusta cuando subo mis proyectos al nivel DocLint porque significa que puedo estar más seguro de que el Javadoc que produzco es realmente lo que pretendo.

Por supuesto, existe el problema si está generando Javadoc en algún código fuente que no ha producido usted mismo, por ejemplo, porque proviene de algún generador de código, por ejemplo, wsimport . Es extraño que Oracle no haya preparado sus propias herramientas para el cumplimiento de JDK8 antes de lanzar JDK8. Parece que no se arreglará hasta Java 9 . Solo en este caso particular, sugiero desactivar DocLint como se documenta en otra parte de esta página.


La solución más corta que funcionará con cualquier versión de Java:

<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <additionalparam>-Xdoclint:none</additionalparam>
        </properties>
    </profile>
</profiles>

Solo agrégalo a tu POM y listo.

Esta es básicamente la respuesta de @ ankon más la respuesta de @ zapp .

Para usuarios de maven-javadoc-plugin 3.0.0:

Reemplazar

<additionalparam>-Xdoclint:none</additionalparam>

por

<doclint>none</doclint>


El nombre de la propiedad de configuración se ha cambiado en la última versión de maven-javadoc-plugin, que es 3.0.0.

Por lo tanto, el <additionalparam> no funcionará. Así que tenemos que modificarlo como abajo.

   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>3.0.0</version>
      <configuration>
         <doclint>none</doclint>
      </configuration>
  </plugin>

Ya que depende de la versión de su JRE que se utiliza para ejecutar el comando maven, es probable que no desee desactivar DocLint por defecto en su pom.xml

Por lo tanto, desde la línea de comandos puede usar el -Dadditionalparam=-Xdoclint:none .

Ejemplo: mvn clean install -Dadditionalparam=-Xdoclint:none


Llegué un poco tarde a la fiesta, pero también me vi obligado a buscar una solución, terminé aquí y luego la encontré.

Esto es lo que funciona para mí:

export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

Y luego comience su compilación de Maven, cualquier compilación de distribución de Linux, etc. Lo bueno es que no requiere la modificación de los archivos de configuración de Maven. No pude hacer eso porque mi objetivo era reconstruir un montón de paquetes Centos rpm, así que ir muy profundo


Esta es la forma más concisa que conozco para ignorar las advertencias de doclint independientemente de la versión de Java utilizada. No es necesario duplicar la configuración del complemento en varios perfiles con pequeñas modificaciones.

<profiles>
  <profile>
    <id>doclint-java8-disable</id>
    <activation>
      <jdk>[1.8,)</jdk>
    </activation>
    <properties>
      <javadoc.opts>-Xdoclint:none</javadoc.opts>
    </properties>
  </profile>
</profiles>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.9.1</version>
      <executions>
        <execution>
          <id>attach-javadocs</id> <!-- The actual id should be apparent from maven output -->
          <configuration>
            <additionalparam>${javadoc.opts}</additionalparam>
          </configuration>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
</build>

Probado en oracle / open jdk 6, 7 y 8.


La mejor solución sería arreglar los errores javadoc. Si por alguna razón eso no es posible (es decir, código fuente generado automáticamente), puede desactivar esta verificación.

DocLint es una nueva característica en Java 8 , que se resume como:

Proporcione un medio para detectar errores en los comentarios de Javadoc al principio del ciclo de desarrollo y de una manera que se vincule fácilmente al código fuente.

Esto está habilitado de forma predeterminada y ejecutará una gran cantidad de comprobaciones antes de generar Javadocs. Debe desactivar esto para Java 8 como se especifica en este hilo . Tendrás que agregar esto a tu configuración de Maven:

<profiles>
  <profile>
    <id>java8-doclint-disabled</id>
    <activation>
      <jdk>[1.8,)</jdk>
    </activation>
    <properties>
      <javadoc.opts>-Xdoclint:none</javadoc.opts>
    </properties>
  </profile>
</profiles>
<build>
  <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.9</version>
        <executions>
            <execution>
                <id>attach-javadocs</id>
                <goals>
                    <goal>jar</goal>
                </goals>
                <configuration>
                    <additionalparam>${javadoc.opts}</additionalparam>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <reportPlugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-javadoc-plugin</artifactId>
              <configuration>
                <additionalparam>${javadoc.opts}</additionalparam>
              </configuration>
            </plugin>
          </reportPlugins>
        </configuration>
      </plugin>
   </plugins>
</build>

Para maven-javadoc-plugin 3.0.x: Reemplazar

<additionalparam>-Xdoclint:none</additionalparam>

con

<doclint>none</doclint>

Al anular la configuración de maven-javadoc-plugin solamente, no soluciona el problema con el mvn site (utilizado, por ejemplo, durante la etapa de lanzamiento) Esto es lo que tenía que hacer:

<profile>
  <id>doclint-java8-disable</id>
  <activation>
    <jdk>[1.8,)</jdk>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <additionalparam>-Xdoclint:none</additionalparam>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <reportPlugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-javadoc-plugin</artifactId>
              <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
              </configuration>
            </plugin>
          </reportPlugins>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

Añadido abajo

JAVA_TOOL_OPTIONS = -DdditionalJOption = -Xdoclint: none

en la configuración del trabajo de Jenkins> Entorno de compilación> Inyectar variables de entorno al proceso de compilación> Contenido de propiedades

Resolví mi problema de construcción de código a través de Jenkins Maven :-)


A partir de maven-javadoc-plugin 3.0.0, debería haber estado utilizando la opción de configuración additionalJOption para configurar una opción adicional de Javadoc, por lo que si desea que Javadoc deshabilite doclint, debe agregar la siguiente propiedad.

<properties>
    ...
    <additionalJOption>-Xdoclint:none</additionalJOption>
    ...
<properties>

También debe mencionar la versión de maven-javadoc-plugin como 3.0.0 o superior.

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

Entonces, ahórrese algunas horas que no lo hice e intente esto si parece que no funciona:

 <additionalJOption>-Xdoclint:none</additionalJOption>

La etiqueta se cambia para las versiones más nuevas.


Puede intentar establecer la propiedad failOnError (consulte la documentación del complemento ) en false :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
              <failOnError>false</failOnError>
            </configuration>
        </execution>
    </executions>
</plugin>

Como puede ver en los documentos, el valor predeterminado es true .





javadoc