Comment contourner le Javadoc Java 8 plus strict lors de l'utilisation de Maven

133

Vous vous rendrez vite compte que JDK8 est beaucoup plus strict (par défaut) en ce qui concerne Javadoc. ( lien - voir le dernier point)

Si vous ne générez jamais de Javadoc, bien sûr, vous ne rencontrerez aucun problème, mais des choses comme le processus de publication de Maven et peut-être vos builds CI échoueront soudainement là où ils fonctionnaient très bien avec JDK7. Tout ce qui vérifie la valeur de sortie de l'outil Javadoc échouera désormais. JDK8 Javadoc est probablement aussi plus verbeux en termes de warningsJDK7 mais ce n'est pas la portée ici. Nous parlons errors!

Cette question existe pour recueillir des propositions sur ce qu'il faut faire à ce sujet. Quelle est la meilleure approche ? Ces erreurs doivent-elles être corrigées une fois pour toutes dans les fichiers de code source? Si vous avez une base de code énorme, cela peut demander beaucoup de travail. Quelles autres options existent?

Vous êtes également invités à commenter avec des histoires de ce qui échoue maintenant qui passerait auparavant.

Histoires d'horreur de ce qui échoue maintenant

outils wsimport

wsimporttool est un générateur de code pour créer des consommateurs de services Web. Il est inclus dans le JDK. Même si vous utilisez l' wsimportoutil de JDK8, il produira néanmoins du code source qui ne peut pas être compilé avec le compilateur javadoc de JDK8 .

balise @author

J'ouvre des fichiers de code source âgés de 3 à 4 ans et vois ceci:

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

Cela échoue maintenant à cause du caractère <. À proprement parler, cela est justifié, mais pas très indulgent.

Tableaux HTML

Tableaux HTML dans votre Javadoc? Considérez ce HTML valide:

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

Cela échoue maintenant avec un message d'erreur no summary or caption for table. Une solution rapide consiste à faire comme ceci:

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

mais pourquoi cela doit être une erreur d'arrêt du monde de l'outil Javadoc me bat ??

Des choses qui échouent maintenant pour des raisons plus évidentes

  1. Liens non valides, par exemple {@link notexist}
  2. HTML malformé, par exemple always returns <code>true<code> if ...

METTRE À JOUR

Liens:

Excellent blog sur le sujet par Stephen Colebourne .

Peterh
la source
13
Ce blog montre comment cela peut être désactivé: blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj
1
Vous pouvez utiliser -Xdoclintmême avec javacpour lui dire de vérifier les documents lors de la compilation…
Holger
1
@HimanshuBhardwaj. Merci d'avoir créé un lien vers le blog de Stephen Colebourne. Le meilleur article que j'ai lu sur ce sujet jusqu'à présent!
peterh
De plus, l'une des "erreurs" est également erronée: 'mauvaise utilisation de'> '- c'est faux,'> 'est parfaitement acceptable en XML, sauf pour la séquence spécifique de']]> 'qui n'est pas acceptée (une des caractères doivent être échappés). Seul «<» doit être échappé, «>» a un mnémonique (gt) pour plus de commodité mais son utilisation est complètement facultative.
StaxMan
Je me demande ce qu'il y a avec la conformité HTML 4 au lieu de HTML 5. Personnellement, je préfère un langage de balisage simple car je dois lire le code source et pas seulement la jolie sortie; et au moins pour moi, la lisibilité humaine du HTML est discutable.
Daniel

Réponses:

56

Pour l'instant, le moyen le plus simple que je connaisse pour contourner le Java 8 Javadoc plus strict lors de l'utilisation de Maven est de le désactiver.

Étant donné que le paramètre -Xdoclint:nonen'existe que dans Java 8, la définition de ce paramètre interrompt la construction pour tout autre Java. Pour éviter cela, nous pouvons créer un profil qui ne sera actif que pour Java 8, en nous assurant que notre solution fonctionne quelle que soit la version de Java.

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

Ajoutez simplement cela à votre POM et vous êtes prêt à partir.


Pour les utilisateurs de maven-javadoc-plugin 3.0.0:

Remplacer

<additionalparam>-Xdoclint:none</additionalparam>

par

<doclint>none</doclint>

Merci @banterCZ!

Fred Porciúncula
la source
3
J'accepterai cela comme la solution la plus probable que la plupart d'entre nous mettront en œuvre. J'aime la <activation>partie. Mais j'aimerais que quelqu'un propose un outil qui pourrait parcourir ces nombreux fichiers sources et aider le développeur à corriger les erreurs ... plutôt que de simplement désactiver DocLint.
peterh
Méfiez-vous en utilisant cette solution si vous comptez sur un autre profil actif par défaut au même moment (en utilisant activeByDefault = true).
mwhs
1
@peterh: Il n'y a aucune signification de documenter complètement tout, c'est un travail dupliqué inutile, par des principes de code propre, il est recommandé de documenter uniquement ce qui n'est pas évident, et l'API publique.
Daniel Hári
1
Cela ne fonctionne pas avec maven-javadoc-plugin version 3.0.0. J'ai dû revenir à la version 3.0.0-M1 pour créer -Xdoclint: aucun ne fonctionne.
Mehrad Sadegh
4
@MehradSadegh Pour maven-javadoc-plugin version 3.0.0, remplacez simplement <additionalparam>-Xdoclint:none</additionalparam>par<doclint>none</doclint>
banterCZ
53

Si vous utilisez le plugin maven javadoc, vous pouvez utiliser l' failOnErroroption pour l'empêcher de s'arrêter s'il trouve des erreurs html:

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

Ou vous pouvez désactiver complètement les options html strictes avec:

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

Pour plus d' informations .

assylies
la source
2
Hmm. Le problème avec ces solutions est que si vous y pensez avec JDK8 Javadoc, vous ne voudriez pas échouer sur les erreurs alors qu'avec JDK7 Javadoc vous le faites. Donc, pour cette raison, je préfère l' -Xdoclintoption. L'espoir est-il qu'il sera ignoré en silence s'il est exécuté avec un Javadoc JDK7?
peterh
2
Vous pourriez appliquer l'option conditionnellement via un profil maven indexé sur la version Java…?
Donal Fellows
14
Non, avec JDK7, il échoue avec javadoc: erreur - indicateur invalide: -Xdoclint: aucun (beau travail Oracle).
Giovanni Toraldo
4

Depuis la version 3.0.0 de maven-javadoc-plugin, le doclint est configuré via la balise XML dédiée

<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
la source
3

J'aime la solution de @ ThiagoPorciúncula mais elle n'est pas allée assez loin pour moi.

J'ai généralement déjà un additionalparamensemble de plugins javadoc qui n'étaient pas remplacés par le profil. Pour cette raison, j'ai dû:

  • Définissez une disableDoclintpropriété comme étant vide par défaut.
  • Si dans java> = 8, définissez la disableDoclintpropriété sur-Xdoclint:none
  • L'utilisation de ${disableDoclint} in theadditionalparam section of themaven-javadoc-plugin`.

Cela semble bien fonctionner, quoique détaillé.

<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>

Ensuite, en bas, je pourrais utiliser la ${disableDoclint}variable facultative dans la additionalparamsection que j'avais déjà définie.

<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>

Cela fonctionne sous java 8 mais ne provoque pas d'erreurs de syntaxe sous java 7. Woo hoo!

gris
la source
2

Notez que pour l'erreur no summary or caption for table, l'utilisation <table summary="">ne fonctionnera plus. Si c'est votre situation, ajoutez un <caption>élément à votre tableau, comme ceci:

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

J'espère que cela aide quelqu'un là-bas. Il m'a fallu un certain temps avant de le découvrir.

Jeronimo Backes
la source
1
Quelle version du JDK? Bien sûr, l' <table summary="">astuce fonctionne toujours sur JDK8. (juste testé sur jdk1.8.0_201)
peterh
@peterh J'ai utilisé jdk 11.
Jeronimo Backes
1
Ceci est la réponse à jour. summary="..."L'attribut n'est plus pris en charge avec HTML5 (la sortie par défaut pour JDK 11 javadoc). Il est également pris en charge dans JDK 8.
kap