web-dev-qa-db-fra.com

Maven ne fonctionne pas dans Java 8 lorsque les balises Javadoc sont incomplètes

Depuis que j'utilise Maven, j'ai pu construire et installer dans mon référentiel local des projets comportant des balises Javadoc incomplètes (par exemple, un paramètre manquant). 

Cependant, depuis que j'ai migré vers Java 8 (1.8.0-ea-b90), Maven est absolument strict à propos des balises de documentation manquantes et me montre de nombreuses erreurs Javadoc liées à des problèmes de Javadoc lorsque j'essaie de créer ou d'installer un projet où Javadoc n'est pas "parfait". Certains des projets que j'essaie de compiler et d'installer dans mon référentiel local sont des projets tiers dont je n'ai aucun contrôle. Donc, la solution de contournement consistant à réparer tous les Javadocs dans tous ces projets ne semble pas être réalisable dans mon scénario.

Ceci est une petite partie de la sortie que je vois quand j'exécute mvn clean package install dans mon projet:

[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] ^

Le plugin Javadoc Maven est configuré comme ceci dans mon 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>

Comme je l'ai déjà dit, tout fonctionne correctement si je retourne à Java 7. Peut-être s'agit-il d'un bogue lié à l'exécution de Maven sous Java 8. Comment puis-je le faire fonctionner (c'est-à-dire pouvoir construire le Javadoc du projet et installer son code dans mon référentiel local) avec Java 8? J'ai testé avec Maven 3.0.3 et 3.0.5 sous OSX.

METTRE À JOUR:

Si je change la configuration de mon plugin Javadoc avec <failOnError>false</failOnError> (merci 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>

Ensuite, le projet est installé dans mon référentiel local. Toutefois, le fichier JAR Javadoc n’est toujours pas généré.

Un fragment de la sortie que je vois dans la console avec cette nouvelle configuration est:

[ERREUR] MavenReportException: Erreur lors de la création de l'archive: quittez code: 1 - /Users/....Java:18: warning: no @param ... Ligne de commande était:/Bibliothèque/Java/Accueil/bin/javadoc @options @packages

Reportez-vous aux fichiers Javadoc générés dans '/Users/sergioc/Documents/workspaces/heal/minitoolbox/target/apidocs' dir.

à org.Apache.maven.plugin.javadoc.AbstractJavadocMojo.executeJavadocCommandLine (AbstractJavadocMojo.Java:5043) à org.Apache.maven.plugin.javadoc.AbstractJavadocMojo.executeReport (AbstractJavadocMojo.Java:1990) à org.Apache.maven.plugin.javadoc.JavadocJar.execute (JavadocJar.Java:181) à org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.Java:101) à org.Apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.Java:209) à org.Apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.Java:153) à org.Apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.Java:145) à org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.Java:84) à org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.Java:59) à org.Apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild (LifecycleStarter.Java:183) à org.Apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.Java:161) à org.Apache.maven.DefaultMaven.doExecute (DefaultMaven.Java:320) à org.Apache.maven.DefaultMaven.execute (DefaultMaven.Java:156) à org.Apache.maven.cli.MavenCli.execute (MavenCli.Java:537) à l'adresse org.Apache.maven.cli.MavenCli.doMain (MavenCli.Java:196) à l'adresse org.Apache.maven.cli.MavenCli.main (MavenCli.Java:141) à l'adresse Sun.reflect.NativeMethodAccessorImpl.invoke0 (Méthode native) à Sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.Java:57) à Sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.Java:43) à Java.lang.reflect.Method.invoke (Method.Java:491) à org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.Java:290) à org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.Java:230) à org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.Java:409) à org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.Java:352)

N'importe quelle solution de contournement sur la manière de créer les sources, d'installer le projet et de générer le fichier JAR Javadoc en une seule étape, car elle fonctionnait avec Java 7?

283
Sergio

La meilleure solution serait de corriger les erreurs javadoc. Si, pour une raison quelconque, cela n’est pas possible (par exemple, un code source généré automatiquement), vous pouvez désactiver cette vérification.

DocLint est une nouvelle fonctionnalité de Java 8 qui est résumée comme suit:

Fournissez un moyen de détecter les erreurs dans les commentaires Javadoc au début du cycle de développement et d’une manière qui soit facilement liée au code source.

Cette option est activée par défaut et exécutera de nombreuses vérifications avant de générer des Javadocs. Vous devez désactiver cette option pour Java 8 comme spécifié dans ce fil . Vous devrez ajouter ceci à votre configuration 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>

Pour maven-javadoc-plugin 3.0.x: Remplacer

<additionalparam>-Xdoclint:none</additionalparam>

avec

<doclint>none</doclint>
349
Subhas

L’approche la plus simple pour faire fonctionner Java 8 et Java 7 consiste à utiliser un profil dans la construction:

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

Voici la manière la plus concise que je connaisse d'ignorer les avertissements doclint, quelle que soit la version de Java utilisée. Il n'est pas nécessaire de dupliquer la configuration du plug-in dans plusieurs profils avec de légères modifications.

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

Testé sur Oracle/open jdk 6, 7 et 8.

56
Oliver Gondža

Ajoutez dans la section des propriétés globales du fichier pom:

<project>
    ...
    <properties>
        <additionalparam>-Xdoclint:none</additionalparam>
    </properties>

La solution commune fournie ici dans les autres réponses (en ajoutant cette propriété dans la section plugins) ne fonctionnait pas pour une raison quelconque. Seulement en le définissant globalement, je pourrais construire le pot javadoc avec succès.

37
zapp

La solution la plus courte compatible avec toutes les versions 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.

Ceci est fondamentalement la réponse de @ ankon plus la réponse de @ zapp .


Pour les utilisateurs de maven-javadoc-plugin 3.0.0:

Remplacer

<additionalparam>-Xdoclint:none</additionalparam> 

par 

<doclint>none</doclint>

34
Fred Porciúncula

Le remplacement de la configuration maven-javadoc-plugin uniquement ne résout pas le problème avec mvn site (utilisé par exemple pendant la phase de publication). Voici ce que je devais faire:

<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>
30
Jakub Skoczen

Je ne pense pas que le simple fait d'éteindre DocLint est une bonne solution, du moins pas à long terme. Comme il est bon que Javadoc soit devenu un peu plus strict, la bonne façon de résoudre le problème de construction consiste à résoudre le problème sous-jacent. Oui, vous aurez finalement besoin de réparer ces fichiers de code source.

Voici les points à surveiller avec lesquels vous pourriez déjà vous enfuir:

  • HTML mal formé (par exemple, une balise de fin manquante, des crochets non échappés, etc.)
  • {@link }s invalide. (il en va de même pour les tags similaires tels que @see)
  • Valeurs @author invalides. Auparavant, ceci était accepté: @author John <[email protected]> mais ce n’est plus le cas à cause des crochets non échappés.
  • Les tables HTML dans Javadoc nécessitent maintenant un résumé ou une légende. Voir cette question pour une explication.

Vous devrez simplement réparer vos fichiers de code source et continuer à construire votre Javadoc jusqu'à ce qu'il puisse être construit sans échec. C'est un peu lourd, mais personnellement, j'aime bien quand j'ai élevé mes projets au niveau de DocLint, car cela signifie que je peux être plus confiant que le Javadoc que je produis correspond bien à mes intentions.

Il y a bien sûr le problème si vous générez Javadoc sur un code source que vous n'avez pas produit vous-même, par exemple parce qu'il provient d'un générateur de code, par exemple. wsimport . Étrange que Oracle n'ait pas préparé ses propres outils pour la conformité JDK8 avant de lancer JDK8. Il semble il ne sera pas corrigé avant Java 9 . Seulement dans ce cas particulier, je suggère de désactiver DocLint comme indiqué ailleurs sur cette page.

28
peterh

Vous pouvez essayer de définir la propriété failOnError (voir documentation du plugin ) sur 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>

Comme vous pouvez le constater à partir de la documentation, la valeur par défaut est true.

18
Martin Ellis

Comme cela dépend de la version de votre JRE utilisée pour exécuter la commande maven, vous ne voulez probablement pas désactiver DocLint par défaut dans votre pom.xml.

Par conséquent, à partir de la ligne de commande, vous pouvez utiliser le commutateur -Dadditionalparam=-Xdoclint:none.

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

17
My-Name-Is

Le nom de la propriété de configuration a été modifié dans la dernière version de maven-javadoc-plugin, version 3.0.0. 

Par conséquent, le <additionalparam> ne fonctionnera pas. Nous devons donc le modifier comme ci-dessous.

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

Alors, économisez quelques heures que je n'ai pas faites et essayez ceci si cela ne semble pas fonctionner:

 <additionalJOption>-Xdoclint:none</additionalJOption>

La balise est modifiée pour les versions plus récentes. 

2
rawrintheclouds

Depuis maven-javadoc-plugin 3.0.0, vous devriez utiliser additionalJOption pour définir une option Javadoc supplémentaire. Par conséquent, si vous souhaitez que Javadoc désactive doclint, vous devez ajouter la propriété suivante. 

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

Vous devez également mentionner la version de maven-javadoc-plugin en tant que version 3.0.0 ou supérieure. 

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>    
</plugin>
2
amanzoor

Ajouté ci-dessous

Java_TOOL_OPTIONS = -DadditionalJOption = -Xdoclint: aucun

dans le travail Jenkins configuration> Environnement de construction> Injecter des variables d'environnement dans le processus de construction> Contenu de la propriété

J'ai résolu mon problème de construction de code avec Jenkins Maven :-)

2
snj

Je ne sais pas si cela va aider, mais même moi, j'ai rencontré le même problème très récemment avec oozie-4.2.0 version. Après avoir lu les réponses ci-dessus, je viens d’ajouter l’option maven par ligne de commande et cela a fonctionné pour moi. Alors, juste partager ici.

J'utilise Java 1.8.0_77 , je n'ai pas essayé avec Java 1.7 

bin/mkdistro.sh -DskipTests -Dmaven.javadoc.opts = '- Xdoclint: -html'  

2
Raghu Kumar

J'aimerais ajouter quelques idées à d'autres réponses

Dans mon cas 

-Xdoclint: aucun

N'a pas fonctionné.

Commençons par cela, dans mon projet, je n'avais pas vraiment besoin de javadoc. Seuls certains plugins nécessaires avaient une dépendance au temps de construction.

Ainsi, le moyen le plus simple de résoudre mon problème était le suivant: 

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>
1
mpasko256

Pour ignorer les balises @param et @return manquantes, il suffit de désactiver le groupe missingdoclint . Ainsi, le javadoc sera toujours vérifié pour les problèmes de syntaxe et de niveau supérieur:

    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <doclint>all,-missing</doclint>
        </configuration>
    </plugin>

Notez que ceci s’applique au plugin version 3.0 ou plus récent.

1
gjoranv