当Javadoc标记不完整时,Maven在Java 8中无法工作

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

然而,自从我迁移到Java 8 (1.8.0-ea-b90), Maven对缺少文档标记是绝对严格的,当我试图构建或安装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] ^

在我的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>改变我的Javadoc插件配置(谢谢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>

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

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

[ERROR] MavenReportException: ERROR while creating archive: Exit code: 1 - /Users/....java:18: warning: no @param…命令行 /Library/Java/Home/bin/javadoc @options @packages

参考中生成的Javadoc文件 ' /用户/ sergioc /文件/工作区/治疗/ minitoolbox /目标/ apidocs ' dir . < / p > < p >在 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) 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(本机方法 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) < / p >

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

213472 次浏览

你可以尝试将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注释中早期检测错误的方法 开发周期,并以一种容易链接回 源代码。< / p >

这在默认情况下是启用的,在生成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+: 替换< / p >

<additionalparam>-Xdoclint:none</additionalparam>

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

这是我所知道的忽略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:none</additionalparam>

通过

<doclint>none</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.javadoc.opts = ' -Xdoclint: html ' . bin

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

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

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

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

对我来说

-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)中,配置属性名称已被更改。

因此,附加paramal>不会起作用。所以我们必须修改如下。

   <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

詹金斯的工作:

Configuration > Build Environment >在Build process中注入环境变量> Properties Content

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

要忽略缺少的@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或更新版本的插件。

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

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