【问题标题】:How can I suppress warnings (codebase-wide) during javadoc compilation?如何在 javadoc 编译期间抑制警告(代码库范围)?
【发布时间】:2023-03-15 23:28:01
【问题描述】:

我被一个遗留的 Java 代码库困住了,当你编译它时,它有成千上万的警告。我很想真正解决所有这些警告的来源,但不幸的是,目前在我的公司这不是一个选择(其他事情,比如“制造产生收入的新产品”被负责人认为是更高的优先级;想象一下) .

现在,我可以忍受所有这些警告,如果不是因为它们很难在我们的持续构建服务器的输出中找到实际错误。构建服务器只是使用了一个 ant 调用,没什么特别的,但到目前为止,我还没有找到任何关于如何修改这个调用以防止警告输出的任何地方。

检查代码并在任何地方添加@SuppressWarnings 注释会起作用,但它也几乎与检查并修复所有警告的来源一样痛苦。所以我真正喜欢的是,如果我能做点什么:

<javadoc suppressWarrnings="true"

或类似的东西,使 javadoc 编译器不输出所有警告消息。这样的事情(全局 javadoc 警告禁用)可能吗?

【问题讨论】:

    标签: java javadoc suppress-warnings


    【解决方案1】:

    如今,一些 javadoc 非标准选项允许您避免过多的错误和/或警告。查看javadoc的帮助(执行javadoc -X);应提供以下非标准选项:

    -Xmaxerrs <number>
    -Xmaxwarns <number>              
    -Xdoclint:(all|none|[-]<group>)
    

    -Xmaxerrs 设置要打印的最大错误数 -Xmaxwarns 设置要打印的最大警告数 -Xdoclint 启用或禁用对 javadoc cmets 中问题的特定检查。

    例如,指定-Xdoclint:none 将禁用对javadoc cmets 中大多数问题的特定检查;而-Xmaxwarns 1 会将警告数量限制为 1(我尝试了-Xmaxwarns 0,但随后它打印了所有警告,所以我的猜测是 0 表示没有限制)

    【讨论】:

      【解决方案2】:

      在 Java 8 中,您可以将 additionalparam="-Xdoclint:none" 添加到 javadoc 任务中。 (Source)

      【讨论】:

      • 执行此操作时我仍然会看到警告,但这比看到我(也)没有时间修复的 99 个警告要好得多。
      【解决方案3】:

      我刚刚发现我在之前的回答中描述的内容有一个更好的变体。编辑 buildresults.xsl,而不是编辑 errors.xsl。此文件包含注释:

      for traditional cc display of only compile errors and warnings
      comment out mode="errors" and uncomment mode="compile" and mode="javadoc"
      

      如果您遵循该评论的建议(注释掉它提到的两行并取消注释它提到的一行),您将获得完全相同的效果,但包含编译错误。

      为什么要使用这种方法而不是我以前的方法?好吧,我认为(我真的应该更好地测试这个,但我很懒)我以前的方法会吃编译错误;这种方法可以保留它们。

      【讨论】:

        【解决方案4】:

        Mark 的回答对我来说听起来不错,并且可能对不使用 Cruise Control 持续构建系统的任何人都有效。然而,我发现对于任何(如我)使用该系统的人来说,还有另一种方法。

        Cruise control 通过使用多个 XSLT 样式表来组合它的报告。在我们的例子中,这些样式表位于:

        ~/applications/cruisecontrol-bin-2.7.3/webapps/cruisecontrol/xsl
        

        但由于我没有设置我们的安装,我不知道这是否是标准路径。无论如何,您应该能够在安装中找到等效目录。在该目录中是一个名为errors.xsl 的文件。要消除警告,您需要对该文件进行两项更改,这两项更改都涉及注释掉现有规则。

        替换:

        <xsl:variable name="total.errorMessage.count" select="count($warn.messages) + count($error.messages)"/>
        

        与:

        <!--        <xsl:variable name="total.errorMessage.count" select="count($warn.messages) + count($error.messages)"/>-->
        <xsl:variable name="total.errorMessage.count" select="count($error.messages)"/>
        

        这将使“错误计数”成为实际错误的计数,而不是错误+警告的​​计数。

        然后,替换:

        <xsl:template match="message[@priority='warn']" mode="errors">
            <xsl:if test="not(starts-with(text(),'cvs update'))">
                <xsl:value-of select="text()"/><br class="none"/>
            </xsl:if>
        </xsl:template>
        

        与:

        <!--<xsl:template match="message[@priority='warn']" mode="errors">
            <xsl:if test="not(starts-with(text(),'cvs update'))">
                <xsl:value-of select="text()"/><br class="none"/>
            </xsl:if>
        </xsl:template>-->
        

        这将隐藏实际的警告本身。或者,您总是可以只删除注释掉的代码,但是您应该首先备份文件,以防您想要恢复您的警告。此外,XSLT 忽略任何非 XSLT 标记,因此除了完全消除警告之外,您还可以对警告执行其他操作:例如,您可以将所有警告包装在 DIV 中,然后使用 CSS/Javascript 来“折叠”警告而不是完全删除它们。

        虽然我最终不得不自己发现这个解决方案,但这里的所有答案都帮助我理解了发生了什么,所以感谢大家的帮助。

        【讨论】:

          【解决方案5】:

          ant 任务和 javadoc 工具本身都无法全局禁用警告。

          我能想到的一种可能的解决方法是将 javadoc 任务作为独立于构建的其余部分的 ant 调用运行。您可以使用 ant 的 -logfile 参数将输出重定向到日志文件而不是控制台。

          【讨论】:

            【解决方案6】:

            试试 -quiet 标志。

            【讨论】:

            • 愚蠢的问题:你碰巧知道如何在ant中传递这个标志吗?
            • 试试这样:
            • 我认为 -quiet 不起作用,因为它只适用于 javadoc 工具,而不适用于标准 doclet。实际产生警告的是 doclet。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-23
            • 2016-10-02
            • 2021-11-03
            • 2011-03-26
            相关资源
            最近更新 更多