使用 Maven 时如何解决更严格的 Java 8 Javadoc

Posted

技术标签:

【中文标题】使用 Maven 时如何解决更严格的 Java 8 Javadoc【英文标题】:How to work around the stricter Java 8 Javadoc when using Maven 【发布时间】:2014-04-27 01:12:00 【问题描述】:

您很快就会意识到 JDK8 对 Javadoc 的要求要严格得多(默认情况下)。 (link - 见最后一个要点)

如果您从不生成任何 Javadoc,那么您当然不会遇到任何问题,但是 Maven 发布过程以及您的 CI 构建可能会突然失败,而它们在 JDK7 上运行得很好。检查 Javadoc 工具的退出值的任何操作现在都将失败。与 JDK7 相比,JDK8 Javadoc 在warnings 方面可能也更冗长,但这不是这里的范围。我们在谈论errors

这个问题的存在是为了收集关于如何处理它的建议。最好的方法是什么?这些错误是否应该在源代码文件中一劳永逸地修复?如果你有一个庞大的代码库,这可能是很多工作。还有哪些其他选择?

也欢迎您对现在失败的故事发表评论。

现在失败的恐怖故事

wsimport 工具

wsimport 工具是用于创建 Web 服务消费者的代码生成器。它包含在 JDK 中。即使您使用 JDK8 中的 wsimport 工具,它仍然会生成源代码 that cannot be compiled with the javadoc compiler from JDK8。

@author 标签

我正在打开 3-4 岁的源代码文件并看到这个:

/**
 * My very best class
 * @author John <john.doe@mine.com> 
 */

现在由于

html 表格

您的 Javadoc 中的 HTML 表?考虑一下这个有效的 HTML:

/**
 *
 * <table>
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

现在失败并显示错误消息no summary or caption for table。一种快速解决方法是这样做:

/**
 *
 * <table summary="">
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

但是为什么这一定是来自 Javadoc 工具的停止世界错误打败了我??

现在由于更明显的原因而失败的事情

    无效链接,例如@link notexist HTML 格式错误,例如always returns &lt;code&gt;true&lt;code&gt; if ...

更新

链接:

优秀的blog on the subjectStephen Colebourne。

【问题讨论】:

这个博客展示了如何关闭它:blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html 您可以使用-Xdoclint 甚至使用javac 告诉它在编译时检查文档... @HimanshuBhardwaj。感谢您链接到 Stephen Colebourne 的博客。到目前为止我读过的关于这个主题的最好的文章! 另外一个“错误”也是错误的:'bad usage of '>' -- 这是错误的,'>' 在 XML 中是完全可以接受的,除了特定的 ']] >' 不被接受(其中一个字符必须被转义)。只有 '' 确实有助记符 (gt) 为方便起见,但它的使用是完全可选的。 我想知道 HTML 4 的合规性而不是 HTML 5 有何不同。就个人而言,我更喜欢简单的标记语言,因为我必须阅读源代码而不仅仅是漂亮的输出;至少对我而言,HTML 的人类可读性是值得商榷的。 【参考方案1】:

目前,我知道在使用 Maven 时绕过更严格的 Java 8 Javadoc 的最简单方法是停用它。

由于参数-Xdoclint:none 仅存在于 Java 8 中,因此定义此参数会破坏任何其他 Java 的构建。为防止这种情况,我们可以创建一个仅对 Java 8 有效的配置文件,以确保我们的解决方案无论 Java 版本如何都能正常工作。

<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <additionalparam>-Xdoclint:none</additionalparam>
        </properties>
    </profile>
</profiles>

只需将其添加到您的 POM 中即可。


对于 maven-javadoc-plugin 3.0.0 用户:

替换

&lt;additionalparam&gt;-Xdoclint:none&lt;/additionalparam&gt;

通过

&lt;doclint&gt;none&lt;/doclint&gt;

谢谢@banterCZ!

【讨论】:

我会接受这是我们大多数人将实施的最可能的解决方案。我喜欢&lt;activation&gt; 部分。但我希望有人能想出一个工具,它可以遍历那些源文件并帮助开发人员修复错误……而不是仅仅关闭 DocLint。 如果您依赖另一个配置文件同时默认处于活动状态(使用 activeByDefault=true),请注意使用此解决方案。 @peterh:完全记录所有内容是没有意义的,这是一项无用的重复工作,根据干净的代码原则,建议只记录不明显的内容和公共 API。 这不适用于 maven-javadoc-plugin 版本 3.0.0。我必须回到版本 3.0.0-M1 才能使 -Xdoclint:none 工作。 @MehradSadegh 对于 maven-javadoc-plugin 版本 3.0.0 只需将 &lt;additionalparam&gt;-Xdoclint:none&lt;/additionalparam&gt; 替换为 &lt;doclint&gt;none&lt;/doclint&gt;【参考方案2】:

如果您使用的是 maven javadoc 插件,您可以使用failOnError 选项来防止它在发现任何 html 错误时停止:

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

或者您可以使用以下命令完全停用严格的 html 选项:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
      <additionalparam>-Xdoclint:none</additionalparam>
    </configuration>
  </plugin>
</plugins>

了解更多info。

【讨论】:

嗯。这些解决方案的问题在于,如果您使用 JDK8 Javadoc 来考虑它,您会希望 not 因错误而失败,而使用 JDK7 Javadoc 则需要。因此,出于这个原因,我最喜欢-Xdoclint 选项。如果使用 JDK7 Javadoc 执行,希望它会被忽略吗? 您可以通过键入 Java 版本的 maven 配置文件有条件地应用该选项...? 不,使用 JDK7 失败并显示 javadoc:错误 - 无效标志:-Xdoclint:none(Oracle 做得很好)。【参考方案3】:

请注意,对于错误no summary or caption for table,使用&lt;table summary=""&gt; 将不再起作用。如果这是您的情况,请将 &lt;caption&gt; 元素添加到您的表中,如下所示:

<table>
    <caption>Examples</caption>
    ...
</table>

希望这可以帮助那里的人。我花了一段时间才发现这一点。

【讨论】:

什么版本的JDK?当然,&lt;table summary=""&gt; 技巧仍然适用于 JDK8。 (刚刚在jdk1.8.0_201上测试过) @peterh 我用的是 jdk 11。 这是最新的答案。 summary="..." 属性不再支持 HTML5(JDK 11 javadoc 的默认输出)。 JDK 8 也支持它。【参考方案4】:

从 maven-javadoc-plugin 3.0.0 版开始,doclint 是通过专用的 XML 标签配置的

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

【讨论】:

【参考方案5】:

我喜欢@ThiagoPorciúncula 的解决方案,但对我来说还远远不够。

我通常已经设置了 javadoc 插件additionalparam,这些插件没有被配置文件覆盖。因此,我不得不:

disableDoclint 属性默认设置为空。 如果在 java 中 >= 8,则将 disableDoclint 属性设置为 -Xdoclint:none 使用$disableDoclint in theadditionalparamsection of themaven-javadoc-plugin`。

这似乎运作良好,虽然很冗长。

<properties>
    <!-- set empty property -->
    <disableDoclint></disableDoclint>
</properties>
<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <!-- set property if >= java 8 -->
            <disableDoclint>-Xdoclint:none</disableDoclint>
        </properties>
    </profile>
    ...
</profiles>

然后在下面我可以在我已经定义的additionalparam 部分中使用可选的$disableDoclint 变量。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <showPackage>false</showPackage>
                <additionalparam>-tag inheritDoc:X $disableDoclint</additionalparam>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <showPackage>false</showPackage>
        <bottom>This documentation content is licensed...</bottom>
        <additionalparam>-tag inheritDoc:X $disableDoclint</additionalparam>
    </configuration>
</plugin>

这在 java 8 下有效,但在 java 7 下不会导致语法错误。哇哦!

【讨论】:

以上是关于使用 Maven 时如何解决更严格的 Java 8 Javadoc的主要内容,如果未能解决你的问题,请参考以下文章

8.2java 方法重写和属性重写

如何将 Eclipse 中的 Maven 3.3.9 更改为 Maven 3.2.5?

Java 9 中的 Maven 更新,Eclipse 中的 Java 8 中的 Maven 编译

Java问题解决:使用maven install 和 package时出错

如何将 Eclipse 项目文件夹结构更改为 Maven/Gradle 结构

当代码具有不完整的 java doc 标签时,Maven 站点因 Java 8 而失败