334

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

但是,由于我迁移到 Java 8 (1.8.0-ea-b90),当我尝试构建或安装一个没有 Javadoc 的项目时,Maven 对缺少文档标签非常严格,并且会向我显示许多与 Javadoc 问题相关的 Javadoc 错误“完美的”。我尝试在本地存储库中编译和安装的一些项目是我无法控制的第三方项目。因此,在我的场景中,仅修复所有这些项目中的所有 Javadocs 的解决方法似乎并不可行。

这是我在项目中执行时看到的一小部分输出mvn clean package install

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

Javadoc Maven 插件在我的 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>

正如我之前所说,如果我回到 Java 7,一切都会正常工作。也许这是与在 Java 8 中运行的 Maven 相关的错误?我如何使用 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。

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

[错误] MavenReportException:创建存档时出错:退出代码:1 - /Users/....java:18:警告:没有@param ...命令行是:/Library/Java/Home/bin/javadoc @options @packages

请参阅“/Users/sergioc/Documents/workspaces/heal/minitoolbox/target/apidocs”目录中生成的 Javadoc 文件。

在 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:145) 在 org.apache. org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)。 maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 在 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)在 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) 在 org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 在 org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 在 sun.reflect.NativeMethodAccessorImpl.invoke0( Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method。在 org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 的 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 调用(Method.java:491)在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 在 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)

关于如何在使用 Java 7 时一步构建源代码、安装项目和生成 Javadoc JAR 的任何解决方法?

4

18 回答 18

411

最好的解决方案是修复 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>

<doclint>none</doclint>
于 2013-05-24T20:28:39.100 回答
99

使用 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>
于 2014-03-10T09:16:28.093 回答
66

这是我知道忽略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 上测试。

于 2014-11-07T16:50:54.023 回答
44

适用于任何 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:none</additionalparam>

经过

<doclint>none</doclint>

于 2016-01-04T12:46:43.133 回答
38

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

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

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

于 2015-05-16T09:44:13.407 回答
33

我不认为仅仅关闭 DocLint 是一个好的解决方案,至少不是长期的。好在 Javadoc 变得更严格了,所以解决构建问题的正确方法是解决底层问题。是的,您最终需要修复这些源代码文件。

以下是您之前可以避免的需要注意的事项:

  • 格式错误的 HTML(例如缺少结束标记、未转义的括号等)
  • 无效{@link }的 (类似的标签也是如此,例如@see
  • 无效@author值。这曾经被接受:@author John <john.doe@mine.com>但由于未转义的括号而不再如此。
  • Javadoc 中的 HTML 表格现在需要摘要或标题。请参阅此问题以获取解释。

您只需修复您的源代码文件并继续构建您的 Javadoc,直到它可以构建而不会失败。是的,很麻烦,但我个人喜欢将我的项目提升到 DocLint 级别,因为这意味着我可以更加确信我生成的 Javadoc 确实是我想要的。

如果您在一些您自己没有生成的源代码上生成 Javadoc,例如因为它来自一些代码生成器,例如wsimport ,那么当然会出现问题。奇怪的是,Oracle 在实际发布 JDK8 之前并没有为 JDK8 合规性准备自己的工具。似乎直到 Java 9 才会修复。仅在这种特殊情况下,我建议关闭本页其他地方记录的 DocLint。

于 2016-01-15T11:15:18.547 回答
31

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

<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>
于 2014-04-10T07:15:30.820 回答
25

您可以尝试将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.

于 2013-05-22T20:07:53.140 回答
18

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

因此,您可以从命令行使用 switch -Dadditionalparam=-Xdoclint:none

例子:mvn clean install -Dadditionalparam=-Xdoclint:none

于 2016-05-03T15:36:39.293 回答
10

配置属性名称已在 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>
于 2017-12-20T21:50:01.177 回答
4

我想对其他答案添加一些见解

就我而言

-Xdoclint:无

没用。

让我们从这个开始,在我的项目中,我根本不需要 javadoc。只有一些必要的插件对它有构建时间依赖。

因此,解决我的问题的最简单方法是:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>
于 2017-10-15T14:05:33.747 回答
4

从 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>
于 2018-01-31T14:54:46.377 回答
3

在下面添加

JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

进入詹金斯工作:

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

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

于 2018-02-15T00:46:15.420 回答
3

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

 <additionalJOption>-Xdoclint:none</additionalJOption>

标签已针对较新的版本进行更改。

于 2018-08-07T14:26:18.280 回答
2

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

我正在使用 java 1.8.0_77,尚未尝试使用 java 1.7

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

于 2016-04-03T02:58:50.800 回答
1

要忽略缺失@param@return标签,禁用missing 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 或更高版本。

于 2018-05-14T10:37:54.037 回答
0

我参加聚会有点晚了,但我也被迫寻找解决方法,最终来到这里,然后找到了它。

这对我有用:-

export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

然后开始你的 Maven 构建,任何 Linux 发行版构建等等。它不需要修改 Maven配置文件 - 我不能这样做,因为我的目标是重建一堆Centos rpm 包,所以不得不走得很深。

于 2018-02-10T01:29:20.813 回答
0

在我的情况下,我使用的是父 pom(不确定这是真正的原因,因为我在争分夺秒地运行),使用了 maven 2.x 和 java 1.6,由于某种原因,上述解决方案不起作用,所以我添加了以下配置文件并对其进行管理以使其运行:

<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>
于 2020-11-10T19:44:48.760 回答