由于我使用 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>
更改我的 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。
我在控制台中看到的带有这个新配置的输出片段是:
[错误] 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) 在 org.apache.maven.lifecycle.internal.LifecycleStarter。 org.apache.maven.lifecycle.internal.Lifecyc 上的 singleThreadedBuild(LifecycleStarter.java:183) leStarter.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) 在 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.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) 在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 在 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
关于如何在使用 Java 7 时一步构建源代码、安装项目和生成 Javadoc JAR 的任何解决方法?
最好的解决方案是修复 javadoc 错误。如果由于某种原因不可能(即:自动生成的源代码),那么您可以禁用此检查。
DocLint is a new feature in Java 8,总结如下:
提供一种在开发周期早期检测 Javadoc 注释中的错误的方法,并且可以轻松链接回源代码。
这是默认启用的,并且会在生成 Javadocs 之前运行大量检查。您需要按照指定的 in this thread 为 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>
使用 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>
这是我知道忽略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 上测试。
适用于任何 Java 版本的最短解决方案:
<profiles>
<profile>
<id>disable-java8-doclint</id>
<activation>
<jdk>[1.8,)</jdk>
</activation>
<properties>
<additionalparam>-Xdoclint:none</additionalparam>
</properties>
</profile>
</profiles>
只需将其添加到您的 POM 中,您就可以开始使用了。
这基本上是 @ankon's answer 加上 @zapp's answer。
对于 maven-javadoc-plugin 3.0.0 用户:
代替
<additionalparam>-Xdoclint:none</additionalparam>
经过
<doclint>none</doclint>
<additionalJOption>-Xdoclint:none</additionalJOption>
或 <doclint>none</doclint>
属性添加到您的 <properties>
<doclint>none</doclint>
(没有基于 JDK 版本的激活),它是否仍然会在 JDK 小于 1.8 时失败,或者 maven-javadoc-plugin自动检测当前Java版本是否支持doclint
选项?
添加到 pom 文件中的全局属性部分:
<project>
...
<properties>
<additionalparam>-Xdoclint:none</additionalparam>
</properties>
其他答案中提供的通用解决方案(在插件部分添加该属性)由于某种原因不起作用。只有通过全局设置,我才能成功构建 javadoc jar。
我不认为仅仅关闭 DocLint 是一个好的解决方案,至少不是长期的。 Javadoc 变得更加严格是件好事,因此修复构建问题的正确方法是修复底层问题。是的,您最终需要修复这些源代码文件。
以下是您之前可以避免的需要注意的事项:
格式错误的 HTML(例如缺少结束标记、未转义的括号等)
{@link } 无效。 (类似的标签也一样,比如@see)
@author 值无效。这曾经被接受:@author John
Javadoc 中的 HTML 表格现在需要摘要或标题。请参阅此问题以获取解释。
您只需修复您的源代码文件并继续构建您的 Javadoc,直到它可以构建而不会失败。是的,很麻烦,但我个人喜欢将我的项目提升到 DocLint 级别,因为这意味着我可以更加确信我生成的 Javadoc 确实是我想要的。
如果您在一些您自己没有生成的源代码上生成 Javadoc,例如因为它来自某个代码生成器,例如 wsimport,那么当然会出现问题。奇怪的是,Oracle 在实际发布 JDK8 之前并没有为 JDK8 合规性准备自己的工具。看起来it won't be fixed until Java 9。仅在这种特殊情况下,我建议关闭本页其他地方记录的 DocLint。
仅覆盖 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>
maven-site-plugin
的 <reportPlugins>
部分配置的 maven-javadoc-plugin
是 not recommended。
您可以尝试将 failOnError
属性(请参阅 plugin documentation)设置为 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
。
由于它取决于用于运行 maven 命令的 JRE 的版本,因此您可能不想在 pom.xml 中默认禁用 DocLint
因此,您可以从命令行使用开关 -Dadditionalparam=-Xdoclint:none
。
示例:mvn clean install -Dadditionalparam=-Xdoclint:none
-Dadditionalparam=-Xdoclint:none
,您的所有构建都将适用于 Java 8。
mvn org.apache.maven.plugins:maven-javadoc-plugin:3.1.0:jar -DadditionalJOption=-Xdoclint:none
- 它对我有用
配置属性名称已在 maven-javadoc-plugin 的最新版本 3.0.0 中更改。
因此
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<doclint>none</doclint>
</configuration>
</plugin>
doclint
文档:maven.apache.org/plugins/maven-javadoc-plugin/…
pom.xml
。就我而言,我所要做的就是搜索 maven-javadoc-plugin
,然后转到已经存在的 <configuration></configuration>
块并添加 <doclint>none</doclint>
。众所周知,这一切都很简单,这里的上下文是我正在尝试修复 OpenGrok 中的一个不同的错误,并且以前从未使用过 Maven,并且不想递归到另一个子项目只是为了弄清楚了解如何应用快速修复。
我想对其他答案添加一些见解
就我而言
-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 开始,您应该已经使用 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>
所以,为自己节省一些我没有的时间,如果它似乎不起作用,试试这个:
<additionalJOption>-Xdoclint:none</additionalJOption>
标签已针对较新的版本进行更改。
-Xdoclint
本身是不够的,但需要额外的参数。较新版本的 maven-javadoc-plugin
为此提供 additionalJOptions
,旧版本不提供。一种解决方法是:<additionalJOption>"-Xdoclint:none" "--allow-script-in-comments"</additionalJOption>
引号很重要,否则插件会添加它们并假定只有一个 arg 而不是两个,从而导致 wrong args
错误。
javadoc: error - Illegal package name: ""-Xdoclint:none" "--allow-script-in-comments""
外引号由日志记录语句添加,并且不存在于 shell 中。我想问题是在 Windows 上 javadoc
由 cmd.exe
执行,它将一个大字符串解析为命令行并按预期拆分 additionalJOption
。在 Linux 上,args 直接单独传递给进程,而 additionalJOption
作为一个参数传递,从而导致错误。
Process Monitor
,没有使用cmd.exe
。 Java 很可能只是简单地构建一个大型命令行并将其传递给 CreateProcess
,以便 Windows 按预期对其进行解析:在空格处拆分 args,同时尊重引号。
在下面添加
JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none
进入詹金斯工作:
配置 > 构建环境 > 将环境变量注入构建过程 > 属性内容
通过 Jenkins Maven 解决了我的代码构建问题 :-)
mvn release:perform
一起使用时,语法需要为 mvn release:perform -Darguments="-Dmaven.javadoc.skip=true"
。
我不确定这是否会有所帮助,但即使我最近在使用 oozie-4.2.0 版本时也遇到了完全相同的问题。在阅读了上述答案后,我刚刚通过命令行添加了 maven 选项,它对我有用。所以,就在这里分享一下。
我正在使用 java 1.8.0_77,尚未尝试使用 java 1.7
bin/mkdistro.sh -DskipTests -Dmaven.javadoc.opts='-Xdoclint:-html'
要忽略缺少的 @param
和 @return
标记,禁用 missing
doclint group 就足够了。这样,仍将检查 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 或更高版本。
我参加聚会有点晚了,但我也被迫寻找解决方法,最终来到这里,然后找到了它。
这对我有用:-
export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none
然后开始你的 Maven 构建,任何 Linux 发行版构建等等。它不需要修改 Maven 配置文件 - 我不能这样做,因为我的目标是重建一堆 Centos rpm 包,所以不得不走得很深。
在我的情况下,我使用的是父 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>
不定期副业成功案例分享
javadoc
不知道这个选项。-Xdoclint:-html
<doclint>none</doclint>
。请参阅maven.apache.org/plugins/maven-javadoc-plugin/…<additionalparam/>
被<additionalOptions/>
取代。请参阅issues.apache.org/jira/browse/MJAVADOC-475