在类路径中包含 log4j 内核时"invalid use of @throws"编译错误



我们大约一周前开始在测试中遇到此错误。它一直在打开和关闭 - 有时人们会得到它,而有时他们不会。

/.../product/integration/src/test/java/com/acme/integration/code/CodeTestUtils.java:74: error: invalid use of @throws
         * @throws Exception if an error occurs.

我想错误消息只是有点模糊。如何无效?代码对我来说还不错:

    /**
     * Iterates to find modules and then calls
     * {@link #checkModule(Path, String, DirectoryStream.Filter, CheckFile)} for each.
     *
     * @param subPath the path within each module to start checks from.
     * @param filter the filter to apply to choose which files to check.
     * @param checkFile the checks to perform on each file.
     * @throws Exception if an error occurs.
     */
    public static void checkProject(String subPath, DirectoryStream.Filter<Path> filter, CheckFile checkFile) throws Exception
    {
        for (Path file : listFiles(EnvironmentUtils.getDevelopmentRoot().toPath()))
        {
            if (FileUtils.isDirectory(file) && FileUtils.exists(file.resolve("src/java")))
            {
                checkModule(file, subPath, filter, checkFile);
            }
        }
    }

我们确实在编译过程中打开DOCLINT,因为我们希望在不必单独运行Javadoc的情况下查找有关Javadoc错误。

这个错误到底是什么意思?我们在这里做什么无效吗?我们在看编译器错误吗?当然,这样的错误会击中第一个试图宣布一种方法引发异常的人...(

到目前为止的调查...

  • 我设法将示例切成一个简单的项目,该项目给出了相同的错误。除了Travis CI能够在Linux上复制它外,我还可以在MacOS上重现它,从今天开始(不知道为什么这是时间依赖时间!(,Windows上的其他用户已经在几天里谈论它。<<<<<<<<<<<<<<
  • 从这个项目中,我查看了命令行Gradle用于Javac,并设法获得相同的错误直接呼叫Javac。
  • 进一步降低Javac命令行:

    javac -source 1.8 -target 1.8 -d build/classes/test 
      -classpath build/classes/main:build/resources/main:$HOME/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.8.2/979fc0cf8460302e4ffbfe38c1b66a99450b0bb7/log4j-core-2.8.2.jar:$HOME/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.8.2/e590eeb783348ce8ddef205b82127f9084d82bf3/log4j-api-2.8.2.jar 
      -Xdoclint:all,-missing 
      src/test/java/com/acme/CodeTestUtils.java
    

    这表明问题仍然存在图片中没有Gradle。(Gradle也添加了-processorpath-g。(

我最终对log4j提交了票,弄清楚即使是Javac中的错误,Oracle也永远不会修复我们无论如何都会报告的关键错误。

显然是log4j的自定义注释处理以某种方式引起了问题 - 在那里的评论建议将 -proc:none添加到Javac命令行中以关闭所有注释处理处理,实际上,随着注释处理关闭,编译现在可以工作!

正是为什么其注释处理器导致这仍然是一个谜。我阅读了代码,但似乎没有修改任何现有类。

根据doclint openjdk源代码,此消息与" dc.invalid.throws"属性关联,并且如果您使用@throws tag,则该属性消息作为错误输出使用非检查类型,或者如果您在构造函数或方法以外的其他内容上使用它。

这些似乎都不适用于您的情况。但是,我已经看到一些人抱怨他们会以不一致的构建收到此消息 - 响应通常是进行完整的重建。

例如。与同一错误消息有关的Lucene Jira,响应是:

通常会发生这些错误(尤其是在Solr的构建中( 是否在输出文件夹附近仍然存在过时的类文件,或者 以前的编译运行失败。

我在没有log4j的情况下重复了此问题。该项目位于https://github.com/rgoers/log4j2-1925。据我所知,任何注释处理器都会发生。

此错误已在http://bugs.java.com/bugdatabase/view_bug.do?bug_id=jdk-8186647。

相关内容

最新更新