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

346

自从我使用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] ^

这是我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,一切都运行良好。也许这与在Java 8中运行的Maven有关的一个错误吗?我该怎么办才能让它工作(即能够构建项目的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 ... 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)

有没有解决方案可以在一步中构建源代码,安装项目并生成 Javadoc JAR,就像在 Java 7 中那样?


嗨@75inchpianist,我已经更新了问题,实际上它们是错误(尽管令人惊讶的是,错误的最后一行提到了一个警告,正如您在生成的输出中所看到的)。该项目未安装在我的本地存储库中,因此它不被视为简单的警告:( - Sergio
对于GoogleJuice:我遇到了错误“error: bad use of '>'”,因为我在JavaDoc注释中有一个大箭头。 - Drew Stephens
3
或许对某些人会有用:你可以通过在IntelliJ中运行检查Ctrl+Alt+Shift+i来轻松找到所有这些不完整的标签,其中包括“声明具有JavaDoc问题”。 - Sergey Ponomarev
1
这不是Maven,而是Javadoc程序,在Java 8中变得更加严格了。 - Thorbjørn Ravn Andersen
19个回答

5
自 maven-javadoc-plugin 3.0.0 起,您应该使用additionalJOption来设置额外的Javadoc选项。如果您想要禁用doclint,您应该添加以下属性。请参见additionalJOption
<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>

4
我希望为其他答案添加一些见解。
在我的情况下,

-Xdoclint:none

没有起作用。
首先,我在项目中根本不需要javadoc。只有一些必要的插件在构建时依赖它。
因此,解决我的问题最简单的方法是:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

3

以下是新增内容:

JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

转化为Jenkins任务:

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

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


这适用于maven-javadoc-plugin 2.4,但从2.5开始(一直到3.0.0),这会导致错误:“退出代码:1 - javadoc:错误-无效标志:-Xdoclint:none”。因此,解决方案是脆弱的。 - Akom
2
当与mvn release:perform一起使用时,语法需要为mvn release:perform -Darguments="-Dmaven.javadoc.skip=true" - PatS

3

因此,如果似乎不起作用,请节省一些我没有的时间并尝试以下方法:

 <additionalJOption>-Xdoclint:none</additionalJOption>

标签在较新版本中已更改。

https://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html#additionalJOption - Thorsten Schöning
有时候-Xdoclint本身不足够,需要额外的参数。新版本的maven-javadoc-plugin提供了additionalJOptions来解决这个问题,旧版本则没有。一种解决方法是:<additionalJOption>"-Xdoclint:none" "--allow-script-in-comments"</additionalJOption>重要的是引号,否则插件会添加它们并假定只有一个参数而不是两个,导致“错误的参数”错误。 - Thorsten Schöning
前者仅适用于Windows,在Linux上会出现以下错误:javadoc: error - Illegal package name: ""-Xdoclint:none" "--allow-script-in-comments"" 外部引号是由日志语句添加的,而在shell中不存在。我猜问题在于在Windows上,javadoccmd.exe执行,它将一个大字符串解析为命令行并按预期拆分additionalJOption。在Linux上,参数直接传递给进程,并将additionalJOption作为一个参数传递,导致出现错误。 - Thorsten Schöning
根据“进程监视器”,未使用cmd.exe。Java很可能只是构建一个大的命令行,并将其传递给CreateProcess,以便Windows按预期进行解析:在空格处拆分参数同时保留引号。 - Thorsten Schöning

2

我不确定这是否有助于解决问题,但最近我也遇到了与oozie-4.2.0版本完全相同的问题。在阅读了以上答案后,我只是通过命令行添加了maven选项,它就为我工作了。因此,在这里分享一下。

我使用的是java 1.8.0_77版本,尚未尝试使用java 1.7。

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


1
要忽略缺失的@param和@return标签,只需禁用missingdoclint 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或更高版本。

0

我来晚了,但我也被迫寻找解决方法,最终在这里找到了答案。

以下是对我有效的方法:

export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

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


0

以下配置对我有效

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

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>

更新:根据此问题:https://issues.apache.org/jira/browse/MNG-6871,它应该在低于JDK 8更新版本1.8.0_u121的Java版本中工作,否则它会抱怨您传递了一个无法识别的标志。 - darkstar_mx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接