wake-up-neo.net

Maven funktioniert nicht in Java 8, wenn Javadoc-Tags unvollständig sind

Seit ich Maven benutze, konnte ich lokale Repository-Projekte mit unvollständigen Javadoc-Tags erstellen und installieren (z. B. einen fehlenden Parameter). 

Seit ich auf Java 8 (1.8.0-ea-b90) umgestiegen bin, ist Maven absolut über fehlende Dokumentations-Tags streng und zeigt mir viele Javadoc-Fehler im Zusammenhang mit Javadoc-Problemen, wenn ich versuche, ein Projekt zu erstellen oder zu installieren, bei dem Javadoc nicht installiert ist "perfekt". Einige der Projekte, die ich in meinem lokalen Repository kompilieren und installieren möchte, sind Projekte von Drittanbietern, über die ich keine Kontrolle habe. Daher scheint es in meinem Szenario nicht möglich zu sein, alle Javadocs in all diesen Projekten zu korrigieren.

Dies ist ein kleiner Teil der Ausgabe, die ich beim Ausführen von mvn clean package install in meinem Projekt sehe:

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

Das Javadoc Maven-Plugin ist in meinem POM folgendermaßen konfiguriert:

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

Wie gesagt, alles funktioniert gut, wenn ich zurück zu Java 7 gehe. Vielleicht ist das ein Fehler, der mit Mavens Ausführung in Java 8 zusammenhängt? Wie kann ich es schaffen, dass es funktioniert? Javadoc des Projekts und installiere seinen Code in meinem lokalen Repository mit Java 8.x Ich habe mit Maven 3.0.3 und 3.0.5 unter OSX getestet.

UPDATE:

Wenn ich meine Javadoc-Plugin-Konfiguration mit <failOnError>false</failOnError> ändere (danke 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>

Dann wird das Projekt in meinem lokalen Repository installiert. Die Javadoc-JAR wird jedoch immer noch nicht generiert.

Ein Teil der Ausgabe, die ich mit dieser neuen Konfiguration in der Konsole sehe, ist:

[ERROR] MavenReportException: Fehler beim Erstellen des Archivs: Beenden code: 1 - /Users/....Java:18: Warnung: nein @param ... Befehlszeile war:/Library/Java/Home/bin/javadoc @options @packages

Verweisen Sie auf die generierten Javadoc-Dateien in '/Users/sergioc/Documents/workspaces/heal/minitoolbox/target/apidocs' dir.

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

Gibt es eine Problemumgehung zum Erstellen der Quellen, zum Installieren des Projekts und zum Generieren der Javadoc-JAR in einem Schritt, da Java 7 verwendet wurde?

283
Sergio

Die beste Lösung wäre, die Javadoc-Fehler zu beheben. Wenn dies aus irgendeinem Grund nicht möglich ist (z. B. automatisch generierter Quellcode), können Sie diese Prüfung deaktivieren.

DocLint ist eine neue Funktion in Java 8 , die wie folgt zusammengefasst wird:

Stellen Sie ein Mittel bereit, um Fehler in Javadoc-Kommentaren früh in der .__ zu erkennen. Entwicklungszyklus und auf eine Weise, die leicht mit dem .__ verknüpft werden kann. Quellcode.

Dies ist standardmäßig aktiviert und führt vor dem Generieren von Javadocs eine ganze Reihe von Prüfungen durch. Sie müssen dies für Java 8 deaktivieren, wie in in diesem Thread angegeben. Sie müssen dies Ihrer Maven-Konfiguration hinzufügen:

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

Für Maven-Javadoc-Plugin 3.0.x: Ersetzen

<additionalparam>-Xdoclint:none</additionalparam>

mit

<doclint>none</doclint>
349
Subhas

Die einfachste Methode, um mit Java 8 und Java 7 zusammenzuarbeiten, ist die Verwendung eines Profils im Build:

<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

Hier ist die prägnanteste Möglichkeit, Doclint-Warnungen unabhängig von der verwendeten Java-Version zu ignorieren. Es ist nicht erforderlich, die Plug-In-Konfiguration in mehreren Profilen mit geringfügigen Änderungen zu duplizieren.

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

Getestet auf Oracle/open jdk 6, 7 und 8.

56
Oliver Gondža

Fügen Sie im Abschnitt für globale Eigenschaften in der POM-Datei Folgendes hinzu:

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

Die allgemeine Lösung, die hier in den anderen Antworten (das Hinzufügen dieser Eigenschaft in den Plug-In-Abschnitt) bereitgestellt wurde, funktionierte aus irgendeinem Grund nicht. Nur durch die globale Einstellung konnte ich das Javadoc-Gefäß erfolgreich bauen.

37
zapp

Die kürzeste Lösung, die mit jeder Java-Version funktioniert:

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

Fügen Sie das einfach zu Ihrem POM hinzu und Sie können loslegen.

Dies ist im Grunde die Antwort von @ ankon plus @ zapps Antwort .


Für maven-javadoc-plugin 3.0.0 Benutzer:

Ersetzen

<additionalparam>-Xdoclint:none</additionalparam> 

durch 

<doclint>none</doclint>

34

Wenn Sie nur die maven-javadoc-plugin-Konfiguration überschreiben, wird das Problem mit mvn site nicht behoben (beispielsweise während der Freigabephase). Folgendes musste ich tun:

<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

Ich denke nicht, DocLint auszuschalten ist eine gute Lösung, zumindest nicht langfristig. Es ist gut, dass Javadoc ein wenig strenger geworden ist. Der richtige Weg, um das Build-Problem zu beheben, ist das zugrunde liegende Problem zu beheben. Ja, Sie müssen diese Quellcodedateien letztendlich korrigieren.

Hier sind die Dinge, auf die Sie achten sollten:

  • Falsches HTML (z. B. fehlendes End-Tag, nicht mit Escapezeichen versehene Klammern usw.)
  • Ungültiger {@link }s (Gleiches gilt für ähnliche Tags wie @see)
  • Ungültige @author-Werte Dies wurde früher akzeptiert: @author John <[email protected]>, aber aufgrund der nicht gekaperten Klammern nicht mehr.
  • HTML-Tabellen in Javadoc erfordern jetzt eine Zusammenfassung oder Beschriftung. Siehe diese Frage zur Erklärung.

Sie müssen lediglich Ihre Quellcodedateien reparieren und Ihr Javadoc so lange weiterbauen, bis es fehlerfrei erstellt werden kann. Umständlich ja, aber ich persönlich mag es, wenn ich meine Projekte auf das DocLint-Niveau gebracht habe, weil ich damit mehr Vertrauen habe, dass der von mir produzierte Javadoc tatsächlich das ist, was ich beabsichtige.

Es gibt natürlich das Problem, wenn Sie Javadoc für einen Quellcode generieren, den Sie nicht selbst erstellt haben, beispielsweise weil er von einem Codegenerator stammt, z. wsimport . Seltsam, dass Oracle vor der Veröffentlichung von JDK8 keine eigenen Tools für die JDK8-Kompatibilität vorbereitet hat. Es scheint es wird nicht behoben bis Java 9 . Nur in diesem Fall schlage ich vor, DocLint wie auf dieser Seite beschrieben zu deaktivieren.

28
peterh

Sie könnten versuchen, die failOnError-Eigenschaft (siehe plugin documentation ) auf false zu setzen:

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

Wie Sie den Dokumenten entnehmen können, ist der Standardwert true.

18
Martin Ellis

Da dies von der Version Ihrer JRE abhängt, mit der der Befehl maven ausgeführt wird, möchten Sie DocLint möglicherweise nicht standardmäßig in Ihrer pom.xml deaktivieren

Daher können Sie von der Befehlszeile aus den Schalter -Dadditionalparam=-Xdoclint:none verwenden.

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

17
My-Name-Is

Der Name der Konfigurationseigenschaft wurde in der neuesten Version von maven-javadoc-plugin (Version 3.0.0) geändert. 

Daher funktioniert das <additionalparam> nicht. Also müssen wir es wie folgt ändern.

   <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

Sparen Sie sich also einige Stunden, die ich nicht getan habe, und probieren Sie es aus, wenn es nicht funktioniert:

 <additionalJOption>-Xdoclint:none</additionalJOption>

Das Tag wird für neuere Versionen geändert. 

2
rawrintheclouds

Ab maven-javadoc-plugin 3.0.0 sollten Sie additionalJOption verwenden, um eine zusätzliche Javadoc-Option festzulegen. Wenn Sie also möchten, dass Javadoc doclint deaktiviert, sollten Sie die folgende Eigenschaft hinzufügen. 

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

Sie sollten auch die Version von maven-javadoc-plugin als 3.0.0 oder höher angeben. 

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

Unten hinzugefügt

Java_TOOL_OPTIONS = -DadditionalJOption = -Xdoclint: keine

in Jenkins Job Konfiguration> Build-Umgebung> Umgebungsvariablen in den Build-Prozess einfügen> Eigenschaften

Mein Problem der Code-Erstellung durch Jenkins Maven wurde gelöst :-)

2
snj

Ich bin mir nicht sicher, ob dies helfen wird, aber selbst mit der Version oozie-4.2.0 hatte ich vor kurzem dasselbe Problem. Nachdem ich die obigen Antworten gelesen hatte, habe ich gerade die Maven-Option über die Befehlszeile hinzugefügt, und es hat für mich funktioniert. Also einfach hier teilen.

Ich verwende Java 1.8.0_77 , habe es nicht mit Java 1.7 versucht 

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

2
Raghu Kumar

Ich möchte einige Einblicke in andere Antworten geben

In meinem Fall 

-Xdoclint: keine

Funktionierte nicht.

Beginnen wir damit, in meinem Projekt brauchte ich Javadoc überhaupt nicht. Nur einige notwendige Plugins hatten eine Abhängigkeit von der Buildzeit.

Der einfachste Weg, mein Problem zu lösen, war also: 

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

Um fehlende @param- und @return-Tags zu ignorieren, reicht es aus, die missingdoclint-Gruppe zu deaktivieren. Auf diese Weise wird der Javadoc immer noch auf höhere Ebenen und Syntaxprobleme geprüft:

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

Beachten Sie, dass dies für die Plugin-Version 3.0 oder neuer gilt.

1
gjoranv

Ich bin ein bisschen zu spät zur Party gekommen, musste aber auch nach einer Lösung suchen, bin hier gelandet und habe sie dann gefunden.

Folgendes funktioniert für mich:

export Java_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

Und dann starten Sie Ihren Maven-Build, einen beliebigen Linux-Distributions-Build usw. Das Schöne daran ist, dass keine Änderung der Maven-Konfigurationsdateien erforderlich ist - das konnte ich nicht Das zu tun, da mein Ziel darin bestand, eine Reihe von Centos rpm-Paketen neu zu erstellen, musste also wirklich tief gehen.

0
Mariusz Borsa