由于我使用Maven,我已经能够在我的本地存储库项目中构建和安装不完整的Javadoc标记(例如,缺少一个参数)。

However, since I migrated to Java 8 (1.8.0-ea-b90) Maven is absolutely strict about missing documentation tags and show me lots of Javadoc errors related to Javadoc problems when I try to build or install a project where the Javadoc is not "perfect". Some of the projects I am trying to compile and install in my local repository are third party projects from which I do not have control. So the workaround of just fixing all the Javadocs in all these projects does not seem to be feasable in my scenario.

这是我在我的项目中执行mvn清洁包安装时看到的输出的一小部分:

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

在我的POM中,Javadoc Maven插件是这样配置的:

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

正如我之前所说,如果我回到Java 7,一切都可以正常工作。 也许这是一个与Maven在Java 8中运行有关的错误? 我如何使用Java 8使其工作(即,能够构建项目的Javadoc并将其代码安装在我的本地存储库中)? 我已经在OSX中用Maven 3.0.3和3.0.5进行了测试。

更新:

如果我用<failOnError>false</failOnError>(谢谢Martin)更改我的Javadoc插件配置:

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

然后将项目安装到本地存储库中。但是,仍然没有生成Javadoc JAR。

我在控制台中看到的这个新配置的输出片段是:

[ERROR] MavenReportException: Error while creating archive: Exit code: 1 - /Users/....java:18: warning: no @param ... Command line was: /Library/Java/Home/bin/javadoc @options @packages Refer to the generated Javadoc files in '/Users/sergioc/Documents/workspaces/heal/minitoolbox/target/apidocs' dir. at org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeJavadocCommandLine(AbstractJavadocMojo.java:5043) at org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeReport(AbstractJavadocMojo.java:1990) at org.apache.maven.plugin.javadoc.JavadocJar.execute(JavadocJar.java:181) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:491) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)

在使用Java 7时,是否有关于如何在一个步骤中构建源代码、安装项目和生成Javadoc JAR的解决方案?


你可以试着将failOnError属性(参见插件文档)设置为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>

从文档中可以看到,默认值是true。


最好的解决方案是修复javadoc错误。如果出于某种原因,这是不可能的(即:自动生成的源代码),那么你可以禁用这个检查。

DocLint是Java 8中的一个新特性,可以概括为:

提供一种在Javadoc注释的早期检测错误的方法 开发周期,并以一种容易链接回 源代码。

这在默认情况下是启用的,在生成Javadocs之前会运行大量的检查。您需要关闭此线程中指定的Java 8的此功能。您必须将此添加到您的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>

对于maven-javadoc-plugin 3.0.0+: 取代

<additionalparam>-Xdoclint:none</additionalparam>

with

<doclint>none</doclint>

让java 8和java 7都能工作的最简单的方法是在构建中使用配置文件:

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

仅覆盖maven-javadoc-plugin配置,不能修复mvn站点的问题(例如在发布阶段使用)。这是我必须做的:

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

这是我所知道的忽略doclint警告的最简洁的方法,而不管使用的是什么java版本。不需要在多个概要文件中复制插件配置,只需稍加修改即可。

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

在oracle/open jdk 6、7、8和11上测试。


添加到pom文件的全局属性部分:

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

在其他答案中提供的通用解决方案(在插件部分中添加该属性)由于某种原因无法工作。只有全局设置,我才能成功构建javadoc jar。


适用于任何Java版本的最短解决方案:

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

只需将其添加到POM中,就可以开始了。

这基本上是@ankon的答案加上@zapp的答案。


对于maven-javadoc-plugin 3.0.0用户:

取代

< additionalparam > -Xdoclint:郎< / additionalparam >

by

< doclint >郎< / doclint >


我不认为仅仅关闭DocLint是一个好的解决方案,至少从长期来看不是。Javadoc变得更严格一点是件好事,因此修复构建问题的正确方法是修复潜在的问题。是的,您最终需要修复这些源代码文件。

以下是你需要注意的事情,这些事情你以前可能会侥幸逃脱:

格式错误的HTML(例如缺少结束标签,未转义的括号等) 无效的{@link}s。(同样适用于类似的标签,如@see) 无效的@author值。@author John <john.doe@mine.com>,但现在不这样了,因为没有转义括号。 Javadoc中的HTML表现在需要摘要或标题。请看这个问题的解释。

您只需要修复源代码文件并继续构建Javadoc,直到它能够正常构建为止。是的,很麻烦,但就我个人而言,我喜欢把我的项目提升到DocLint级别,因为这意味着我可以更有信心,我生成的Javadoc实际上是我想要的。

当然,如果您在一些不是自己生成的源代码上生成Javadoc,就会出现问题,例如,因为它来自一些代码生成器,例如wsimport。奇怪的是,Oracle在发布JDK8之前并没有准备自己的遵从JDK8的工具。这个问题似乎要到Java 9才能解决。只有在这种特殊情况下,我才建议关闭DocLint,如本页其他地方所述。


我不确定这是否会有所帮助,但即使是我也在最近使用oozie-4.2.0版本时遇到了完全相同的问题。读完上面的答案后,我刚刚通过命令行添加了maven选项,它对我有用。所以,在这里分享一下。

我使用的是java 1.8.0_77,没有尝试过java 1.7

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


由于它取决于用于运行maven命令的JRE版本,因此您可能不想在pom.xml中禁用默认的DocLint

因此,在命令行中你可以使用-Dadditionalparam=-Xdoclint:none开关。

例如:mvn clean install -Dadditionalparam=-Xdoclint:无


我想对其他答案补充一些见解

对我来说

-Xdoclint:没有

没有工作。

首先,在我的项目中,我根本不需要javadoc。只有一些必要的插件在构建时依赖于它。

所以,解决我的问题最简单的方法是:

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

在maven-javadoc-plugin的最新版本(3.0.0)中,配置属性名称已被更改。

因此<additionalparam>将不起作用。所以我们必须修改如下。

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

从maven-javadoc-plugin 3.0.0开始,你应该使用additionalJOption来设置一个额外的Javadoc选项,所以如果你想让Javadoc禁用doclint,你应该添加以下属性。

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

您还应该提到maven-javadoc-plugin的版本为3.0.0或更高版本。

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

我来晚了一点,但我也被迫寻找变通办法,最后来到这里,然后找到了它。

以下是对我有效的方法:-

export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

然后开始你的Maven构建,任何Linux发行版构建等等。它的优点是不需要修改Maven配置文件——我不能这样做,因为我的目标是重新构建一堆Centos rpm包,所以必须深入研究。


添加以下

JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

詹金斯的工作:

配置>构建环境>向构建过程注入环境变量>属性内容

通过Jenkins Maven解决了我的代码构建问题:-)


要忽略缺失的@param和@return标记,禁用缺失的doclint组就足够了。这样,javadoc仍然会检查更高级别和语法问题:

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

注意,这是针对3.0或更新版本的插件。


所以,为自己节省一些我没有的时间,如果看起来不起作用,试试这个:

 <additionalJOption>-Xdoclint:none</additionalJOption>

该标记针对较新的版本进行了更改。


在我的例子中,我使用的是父pom(不确定这是真正的原因,因为我在争分秒秒地工作),maven 2。由于某些原因,上面的解决方案不起作用,所以我添加了以下配置文件,并管理它使其运行:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>myapp</artifactId>
    <packaging>war</packaging>
    <name>myapp</name>
    <version>0.0.1-SNAPSHOT</version>
    <description>My App</description>
    <parent>
        <groupId>com.mycompany</groupId>
        <artifactId>parent-artifact</artifactId>
        <version>0.0.1</version>
    </parent>

    <profiles>
        <profile>
            <id>doclint-java6-disable</id>
            <activation>
                <jdk>[1.6,)</jdk>
            </activation>
            <properties>
                <additionalparam>--allow-script-in-comments</additionalparam>
            </properties>
        </profile>
    </profiles>
</project>

下面的配置很适合我

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