【问题标题】:"invalid use of @throws" compile error when having log4j-core in classpath在类路径中有 log4j-core 时“@throws 的使用无效”编译错误
【发布时间】:2017-10-31 17:58:52
【问题描述】:

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

/.../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。

这个错误到底是什么意思?我们在这里所做的有什么无效的吗?我们是否正在查看编译器错误?肯定会遇到这样的错误,第一个尝试声明方法抛出异常的人... :(

到目前为止的调查......

  • 我设法将示例缩减为simple project,其中gives the same error。除了 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。)

【问题讨论】:

  • 好吧,首先发送Exception 会出现问题,因为您无法正确管理异常,因为您不知道它到底是什么异常(我看到Path,所以会有IOException,可能更多checkModule)。所以它至少应该是一个警告;)作为你真正的问题,你有没有注意到用户收到这个错误的任何模式? (操作系统、IDE 编码、JDK 版本......)我从来没有得到过这样的东西,所以我会押注文件本身。
  • 无法使用与您相同的文档重新生成问题。
  • 我们现在可以在 Windows 和 macOS 上看到它,并且正在等待我们的单个 Linux 用户使用它。似乎一开始只有一个人可以看到它,但现在多人可以复制它。我已经设法进一步缩减了我自己的示例,现在只有一个测试文件,没有实际代码,并且在编译测试时我仍然得到错误。
  • Linux 也这样做了,添加了 Travis CI 构建结果的链接。不错。
  • @AmberBeriwal 显然 Travis CI 能够重现它。我在主要问题中放置了构建日志的链接。我们还有几个不同的工作环境在我的简化示例中重现它。

标签: java java-8 log4j2 java-annotations


【解决方案1】:

我最终向 Log4j 提交了a ticket,认为即使它是 javac 中的错误,Oracle 也永远不会修复我们报告的严重错误。

显然,Log4j 的自定义注解处理以某种方式导致了问题 - 那里的注释建议将 -proc:none 添加到 javac 命令行以关闭所有注解处理,事实上,在注解处理关闭的情况下,编译现在可以工作了!

究竟为什么它的注解处理器会导致这种情况仍然是一个谜。我阅读了代码,但它似乎没有修改任何现有的类。

【讨论】:

  • 注解处理器通常似乎是有问题的,尤其是与构建工具一起使用时,这些构建工具会查看依赖关系以进行增量构建。我有一个使用 JMH 的项目,每次运行 mvn 时都必须进行完全重建,否则我会收到“endPosTable 已设置”错误。
  • @jon-hanson 他们有点有趣。我的印象是,因为我删除了 -processor-path,它不会把它放在注释处理器的路径上,并且不知道仅仅在编译类路径上就足以做一些非常邪恶的事情。给我一个邪恶的类库的新想法。
【解决方案2】:

根据 DocLint OpenJDK source code,此消息与“dc.invalid.throws”属性相关联,如果您使用具有非异常类型的 @throws 标记,该属性消息将作为错误输出或者如果您将它用于构造函数或方法以外的其他东西。

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

例如this Lucene Jira 涉及到同样的错误信息,响应为:

这些错误通常会发生(尤其是在 Solr 的构建中),如果有 过时的类文件仍在输出文件夹中,或者如果 之前的编译运行失败。

【讨论】:

  • 你提到 Lucene 构建很有趣。我自己在那里发表了评论,询问他们是否发现了任何有关根本原因的信息。我发现的唯一其他对错误的引用是其他一些项目,它似乎建议在错误时关闭故障,但在他们的情况下,它来自 javadoc 而不是 javac,这可能有所不同。
  • @Trejkaz 我猜这与使用 Gradle 有关。也许它没有正确管理依赖关系并且无法重新编译 Java 文件。代码本身对我来说很好。
  • Gradle 现已被排除。唯一涉及的东西是 javac 和几个 log4j2 jars。删除 log4j2 jar 似乎可以避免它,但如果我们在实际项目中这样做,我们将无法进行任何日志记录。 XD
  • @Trejkaz log4j2 与您项目中的任何内容或其依赖项之间是否存在任何包/类名称冲突。老实说,抓着稻草……
  • 我发布的示例仅包含一个库,来自 log4j2 的 log4j-core。所以我的意思是,它可能会发生冲突……与自身发生冲突……但如果是,那可能是他们的东西中的一个错误。
【解决方案3】:

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

此错误已通过http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8186647 提交给 Oracle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2023-03-04
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多