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


312

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

但是,由于我迁移到Java 8(1.8.0-ea-b90),因此Maven对缺少文档标签的要求绝对严格,并在尝试构建或安装Javadoc不在其中的项目时向我展示许多与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有关的bug?如何使用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 @包装

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

在org.apache.maven.plugin上org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeReport(AbstractJavadocMojo.java:1990)上org.apache.maven.plugin.javadoc.AbstractJavadocMojo.executeJavadocCommandLine(AbstractJavadocMojo.java:5043) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)的.javadoc.JavadocJar.execute(JavadocJar.java:181)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。位于org.apache.maven.lifecycle.internal.LifecycleModuleBuilder的maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)。org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)的org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)的buildProject(LifecycleModuleBuilder.java:59)在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(位于java.lang.reflect.Method处的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)处的本机方法(NativeMethodAccessorImpl.java:57)。在org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)处调用(Method.java:491)在org.codehaus.plexus.classworlds.launcher.Launcher.launch增强(Launcher.java:290)在org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)在org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)

关于如何构建源代码,安装项目以及在与Java 7一起工作的一步中生成Javadoc JAR的任何变通办法?


@ 75inchpianist,您好,我已经更新了问题,实际上它们是错误(尽管令人惊讶的是,错误的最后一行引用了警告,您可以在生成的输出中看到)。该项目未安装在我的本地存储库中,因此它不被视为简单的警告:(
Sergio

对于GoogleJuice:我收到错误“错误:滥用'>'”,因为JavaDoc注释中有一个大箭头
Drew Stephens 2014年

1
也许对某人有用:您可以通过运行检查Ctrl + Alt + Shift + i“声明存在JavaDoc问题”,轻松地在IntelliJ中找到所有这些不完整的标记
Sergey Ponomarev

1
这不是行家,而是Javadoc程序,在Java 8中变得更加严格。
ThorbjørnRavn Andersen

Answers:


387

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

18
有没有办法使它与JDK 8 JDK 7一起使用?它在JDK 7上失败,因为它javadoc不知道该选项。
Feuermurmel

8
虽然这可以回答这里提出的问题,但我还是建议未来的访问者首先检查peterh的答案:stackoverflow.com/a/34809831/1180785(大多数遇到此问题的人都只能在几个地方进行修复,所以更好修复它们,而不是禁用检查!)
Dave

8
对于maven-javadoc-plugin,请使用<doclint>none</doclint>。见maven.apache.org/plugins/maven-javadoc-plugin/...
coolersport

11
同样,由于maven-javadoc-plugin 3.0.0 <additionalparam/>被替换为<additionalOptions/>。参见issue.apache.org/jira/browse/MJAVADOC-475
fdelsert

1
没错 我想通知您,在从Maven 2迁移到Maven 3的过程中,不要忘记此插件标签不应包含在报告标签中,而应直接包含在pluginManagement(pom.xml)中
dimeros

97

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

1
最好的解决方案可能是您的解决方案与以下Zapp提供的解决方案之间的混合。如果以这种方式保留它,则mvn site:site命令仍然会崩溃。您应该创建一个由1.8 jdk激活的配置文件,该配置文件设置了全局属性。
Max Nad 2015年

64

这是我知道的最简洁的方法,无论使用什么Java版本,都可以忽略doclint警告。只需稍加修改,就无需在多个配置文件中重复插件配置。

<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上测试


1
那应该放在哪里呢?
clearlight

1
@clearlight,两者buildprofiles都是maven中的顶级块pom.xmlmaven.apache.org/pom.html#Build
奥利弗·冈萨(OliverGondža),

谢谢。我最终发现了这一点,但是将其与该答案相关联是很好的。
clearlight '19

38

在pom文件的“全局属性”部分中添加:

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

由于其他原因,此处在其他答案中提供的常见解决方案(在插件部分添加了该属性)无效。只有全局设置它,我才能成功构建javadoc jar。


1
这是唯一对我有用的解决方案。我也在这里阅读了答案:blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
acvcu

37

适用于任何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>


这对我来说是最好的解决方案。它适用于Java 7和Java 8机器人。但是它的工作方式是一种魔术:。此参数“ additionalParam”如何添加到插件javadoc中(而不添加到其他插件)
pdem,2016年

1
@pdem附加参数被添加到Maven,而不是Javadoc插件。无论您是否显式使用插件,此解决方案都可以使用。
FredPorciúncula,2016年

2
从maven-javadoc-plugin 3.0.0开始,您必须在<additionalJOption>-Xdoclint:none</additionalJOption><doclint>none</doclint><properties>
Sergi

是的,添加与JDK 8相关的配置文件并设置<doclint> none </ doclint>可以解决此问题。它生成的Javadoc jar与在JDK 7中生成的Javadoc jar相同。
Saurabhcdt

1
您能否澄清一下:如果使用maven-javadoc-plugin 3.0.0及更高版本,如果我仅指定<doclint>none</doclint>(不进行基于JDK版本的激活),它在JDK低于1.8时仍会失败,还是maven-javadoc-plugin自动检测是否doclintJava的当前版本支持该选项吗?
Garret Wilson

31

我认为仅关闭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。


1
也就是说,对于生成的代码,您完全可以同意,只需在javadoc插件的配置部分中添加excludePackageNames部分,即可告诉插件不要处理给定软件包中的代码。看到maven.apache.org/plugins/maven-javadoc-plugin/examples/...
Newtopian

@Newtopian。好点子。但是,就我而言,我实际上需要从中生成代码wsimport才能成为Javadoc的一部分。
peterh

这说起来容易做起来难做,因为我们中很多人都在尝试构建陌生的开源代码,这些代码在某个地方具有Maven依赖关系,我们不知道其全部工作原理,因此没有简单的方法来解决根本原因。有关背景的看法太多。人们需要更多地概括答案的范围,并提供有关如何进行修复的更多细节。
clearlight

30

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>

3
这一点很重要,因为在站点插件激活中缺少此设置会导致release:prepare运行良好而导致release:perform失败。查找和修复可能是一个非常烦人的问题。
Peter N. Steinmetz

请注意,该的配置maven-javadoc-plugin通过<reportPlugins>的部分maven-site-plugin不推荐的最新版本的Maven 3
马丁低洼

@MartinHöller那么如何以适当的方式解决与mavene-javadoc-plugin:3.0.1相关的release:perform阶段的错误?
Vitalii Diravka '18

@VitaliiDiravka取决于错误。。。请为此提出另一个问题。
马丁·霍勒(MartinHöller)

22

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


感谢@Martin的想法。至少有了该属性,我才能再次构建和安装项目,但是我仍然缺少java doc jar(我需要将其部署到Maven Central)。我用实验的详细信息更新了我的问题。
塞尔吉奥

这对我来说是最充分的答案。我只想在javadocs仍不完整的持续开发过程中测试构建。
ZachSand

17

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

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

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


3
这特别有用,因为您也可以使用它。设置“全球MAVEN_OPTS”(在“配置系统”)来-Dadditionalparam=-Xdoclint:none与所有的构建将使用Java 8.工作
威尔弗雷德·休斯

mvn org.apache.maven.plugins:maven-javadoc-plugin:3.1.0:jar -DadditionalJOption=-Xdoclint:none-它对我
有用

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>


为我在19年2月从github源构建OpenGrok解决了该问题。应该提到您的补丁进入pom.xml项目的src / build目录。就我而言,我要做的就是搜索maven-javadoc-plugin,然后转到<configuration></configuration>已经存在的块并添加<doclint>none</doclint>。就这么简单,这已经是一个人所知道的了,这里的上下文是我试图修复OpenGrok中的另一个错误,并且以前从未使用过Maven,并且不想不得不递归到另一个子项目中只是为了弄清楚了解如何应用快速修复。
clearlight '19

4

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

就我而言

-Xdoclint:无

没用

首先,在我的项目中,我根本不需要Javadoc。只有一些必要的插件对此具有构建时间依赖性。

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

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

4

作为Maven的Javadoc的插件3.0.0你应该一直使用additionalJOption设置一个额外的Javadoc选项,所以如果你想的Javadoc来禁用doclint,您应该添加以下属性。

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

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

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

3

因此,为自己节省一些我没有用的时间,如果它似乎不起作用,请尝试以下操作:

 <additionalJOption>-Xdoclint:none</additionalJOption>

标记已更改为较新的版本。



有时-Xdoclint本身还不够,但是需要附加的参数。为此maven-javadoc-plugin提供additionalJOptions了较新的版本,较旧的版本则没有。一种解决方法是:<additionalJOption>"-Xdoclint:none" "--allow-script-in-comments"</additionalJOption>引号很重要,否则插件会添加引号,并假定仅一个arg而不是两个arg,从而导致wrong args错误。
ThorstenSchöning18年

前者仅在Windows上有效,而在Linux上有效:javadoc: error - Illegal package name: ""-Xdoclint:none" "--allow-script-in-comments""外部引号由logging语句添加,并且不存在于外壳中。我猜问题是在Windows javadoc上由执行cmd.exe,它将一个大字符串解析为命令行并按additionalJOption预期方式拆分。在Linux上,args分别直接传递给进程,并additionalJOption作为一个参数传递,从而导致错误。
ThorstenSchöning,

根据Process Monitorcmd.exe不使用。Java最有可能只是构建一个大命令行并将其传递给CreateProcess,以便Windows可以按预期对其进行解析:在空格处拆分args,同时遵守引号。
ThorstenSchöning,

3

在下面添加

JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

进入詹金斯工作:

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

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


这适用于maven-javadoc-plugin 2.4,但从2.5开始(一直到3.0.0),这会导致错误:“退出代码:1-javadoc:error-无效标志:-Xdoclint:none”。因此解决方案很脆弱。
阿科姆(Akom)'18年

1
mvn release:perform语法一起使用时需要mvn release:perform -Darguments="-Dmaven.javadoc.skip=true"
PATS

2

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

我正在使用Java 1.8.0_77,还没有尝试过Java 1.7

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


1

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


0

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

这是对我有用的东西:

export JAVA_TOOL_OPTIONS=-DadditionalJOption=-Xdoclint:none

然后启动您的Maven构建,任何Linux发行版本等。关于它的好处是它不需要修改Maven 配置文件-我无法这样做,因为我的目标是重建一堆Centos rpm软件包,因此必须真的很深入

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.