Cómo evitar el Javadoc Java 8 más estricto cuando se utiliza Maven

133

Te darás cuenta rápidamente de que JDK8 es mucho más estricto (por defecto) cuando se trata de Javadoc. ( enlace - ver el último punto)

Si nunca genera ningún Javadoc, por supuesto, no experimentará ningún problema, pero cosas como el proceso de lanzamiento de Maven y posiblemente sus compilaciones de CI fallarán de repente donde funcionaron bien con JDK7. Cualquier cosa que verifique el valor de salida de la herramienta Javadoc ahora fallará. JDK8 Javadoc es probablemente también más detallado en términos de warningscomparación con JDK7, pero ese no es el alcance aquí. Estamos hablando errors!

Esta pregunta existe para recopilar propuestas sobre qué hacer al respecto. Cuál es el mejor enfoque ? ¿Deben estos errores corregirse de una vez por todas en los archivos de código fuente? Si tiene una gran base de código, esto podría ser mucho trabajo. ¿Qué otras opciones existen?

También puede comentar con historias de lo que ahora falla y que anteriormente pasaría.

Historias de terror de lo que ahora falla

herramientas wsimport

wsimportLa herramienta es un generador de código para crear consumidores de servicios web. Está incluido en el JDK. Incluso si utiliza la wsimportherramienta de JDK8, producirá un código fuente que no puede compilarse con el compilador javadoc de JDK8 .

Etiqueta @author

Estoy abriendo archivos de código fuente de 3 a 4 años y veo esto:

/**
 * My very best class
 * @author John <[email protected]> 
 */

Esto ahora falla debido al carácter <. Estrictamente hablando, esto está justificado, pero no es muy indulgente.

Tablas HTML

Tablas HTML en su Javadoc? Considere este HTML válido:

/**
 *
 * <table>
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

Esto ahora falla con el mensaje de error no summary or caption for table. Una solución rápida es hacer esto:

/**
 *
 * <table summary="">
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

pero ¿por qué esto tiene que ser un error de detener el mundo de la herramienta Javadoc me gana?

Cosas que ahora fallan por razones más obvias

  1. Enlaces inválidos, p. Ej. {@link notexist}
  2. HTML con formato incorrecto, p. Ej. always returns <code>true<code> if ...

ACTUALIZAR

Enlaces:

Excelente blog sobre el tema de Stephen Colebourne .

Peter
fuente
13
Este blog muestra cómo se puede desactivar: blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj
1
Puedes usar -Xdoclintincluso javacpara decirle que revise los documentos mientras compilas ...
Holger
1
@HimanshuBhardwaj. Gracias por enlazar al blog de Stephen Colebourne. ¡La mejor pieza que he leído sobre este tema hasta ahora!
Peter
Además, uno de los "errores" también es erróneo: 'mal uso de'> '- esto está mal,'> 'es perfectamente aceptable en XML, excepto por la secuencia específica de']]> 'que no se acepta (uno de caracteres se deben escapar). Solo '<' debe escaparse, '>' tiene mnemónico (gt) por conveniencia, pero su uso es completamente opcional.
StaxMan
Me pregunto qué pasa con el cumplimiento de HTML 4 en lugar de HTML 5. Personalmente, preferiría un lenguaje de marcado simple ya que tengo que leer el código fuente y no solo la salida bonita; y al menos para mí, la legibilidad humana de HTML es discutible.
Daniel

Respuestas:

56

Por ahora, la forma más fácil que sé para evitar el Javadoc Javadoc más estricto cuando uso Maven es desactivarlo.

Dado que el parámetro -Xdoclint:nonesolo existe en Java 8, la definición de este parámetro rompe la compilación para cualquier otro Java. Para evitar esto, podemos crear un perfil que estará activo solo para Java 8, asegurándonos de que nuestra solución funcione independientemente de la 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.


Para usuarios de maven-javadoc-plugin 3.0.0:

Reemplazar

<additionalparam>-Xdoclint:none</additionalparam>

por

<doclint>none</doclint>

Gracias @banterCZ!

Fred Porciúncula
fuente
3
Aceptaré esto como la solución más probable que la mayoría de nosotros implementaremos. Me gusta la <activation>parte Pero desearía que a alguien se le ocurriera una herramienta que pudiera revisar esos muchos archivos fuente y ayudar al desarrollador a corregir los errores ... en lugar de simplemente apagar DocLint.
Peter
Tenga cuidado al usar esta solución si confía en que otro perfil esté activo por defecto al mismo tiempo (usando activeByDefault = true).
mwhs
1
@peterh: no tiene sentido documentar completamente todo, es un trabajo duplicado inútil, por principios de código limpio se recomienda documentar solo lo que no es obvio y la API pública.
Daniel Hári
1
Esto no funciona con maven-javadoc-plugin versión 3.0.0. Tuve que volver a la versión 3.0.0-M1 para hacer -Xdoclint: ninguno funciona.
Mehrad Sadegh
44
@MehradSadegh Para la versión 3.0.0 de maven-javadoc-plugin simplemente reemplace <additionalparam>-Xdoclint:none</additionalparam>por<doclint>none</doclint>
banterCZ
53

Si está utilizando el complemento maven javadoc, puede usar la failOnErroropción para evitar que se detenga si encuentra algún error html:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <configuration>
    <failOnError>false</failOnError>
  </configuration>
</plugin>

O puede desactivar completamente las estrictas opciones html con:

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

Para obtener más información .

asilias
fuente
2
Hmm El problema con estas soluciones es que si se piensa en ello con JDK8 Javadoc que usted quiere no fallar en los errores mientras que con JDK7 Javadoc que haces. Por eso me gusta más la -Xdoclintopción. La esperanza es que se ignorará en silencio si se ejecuta con un Javadoc JDK7.
Peter
2
¿Podría aplicar la opción condicionalmente a través de un perfil de Maven con clave en la versión de Java ...?
Donal Fellows
14
No, con JDK7 falla con javadoc: error - indicador inválido: -Xdoclint: ninguno (buen trabajo Oracle).
Giovanni Toraldo
4

Desde la versión 3.0.0 de maven-javadoc-plugin, doclint se configura a través de la etiqueta XML dedicada

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

Me gusta la solución de @ ThiagoPorciúncula, pero no fue lo suficientemente lejos para mí.

Por lo general, ya tengo el additionalparamconjunto de complementos javadoc que el perfil no anula. Debido a esto tuve que:

  • Establecer una disableDoclintpropiedad para que esté vacía de forma predeterminada.
  • Si en Java> = 8, establezca la disableDoclintpropiedad en-Xdoclint:none
  • El uso ${disableDoclint} in theadicionalparam section of themaven-javadoc-plugin`.

Esto parece funcionar bien aunque detallado.

<properties>
    <!-- set empty property -->
    <disableDoclint></disableDoclint>
</properties>
<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <!-- set property if >= java 8 -->
            <disableDoclint>-Xdoclint:none</disableDoclint>
        </properties>
    </profile>
    ...
</profiles>

Luego, abajo, podría usar la ${disableDoclint}variable opcional en la additionalparamsección que ya había definido.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <showPackage>false</showPackage>
                <additionalparam>-tag inheritDoc:X ${disableDoclint}</additionalparam>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <showPackage>false</showPackage>
        <bottom>This documentation content is licensed...</bottom>
        <additionalparam>-tag inheritDoc:X ${disableDoclint}</additionalparam>
    </configuration>
</plugin>

Esto funciona en Java 8 pero no causa errores de sintaxis en Java 7. ¡Guau!

gris
fuente
2

Tenga en cuenta que para el error no summary or caption for table, el uso <table summary="">ya no funcionará. Si esa es su situación, agregue un <caption>elemento a su tabla, como este:

<table>
    <caption>Examples</caption>
    ...
</table>

Espero que esto ayude a alguien por ahí. Me tomó un tiempo hasta que descubrí esto.

Jerónimo Backes
fuente
1
¿Qué versión del JDK? Seguro que el <table summary="">truco aún funciona en JDK8. (recién probado en jdk1.8.0_201)
Peter
@peterh usé jdk 11.
Jerónimo Backes
1
Esta es la respuesta actualizada. summary="..."El atributo ya no es compatible con HTML5 (la salida predeterminada para JDK 11 javadoc). También es compatible con JDK 8.
kap