有没有办法用PMD,Checkstyle,SpotBugs等不兼容的Java API引用?

Jea*_*her 8 java checkstyle pmd spotbugs

当前,我们正在使用Java Compiler 11,并将主要工件部署到Java11。在这里没有问题。

不幸的是,我们使用的服务仅支持Java 8,因此我们针对Java 8编译了其中的一些。

我们的问题是,开发人员可能会引用Java 8在运行时不可用的方法,例如List.of()Optional::stream等。javac版本11会将其编译为Java 8,但是在JVM版本8上执行时将引发异常。

后者很容易通过一个简单的grep语句来识别,但是后者则比较棘手,需要理解代码/ AST。

我没有检查Checkstyle,Spotbugs和PMD的文档。IntelliJ实际上非常擅长于此,但是它无法集成到我们的CI管道中。

我们得到了这个天真/简单的grep语句:

grep --recursive --extended-regexp '[ \(](List|Set|Map).of' 'our_project'
Run Code Online (Sandbox Code Playgroud)

我们希望有一种准确的方法来识别不兼容的API。

ada*_*gel 2

在 Java 9 之前,您需要使用Animal Sniffer 插件或为 javac 配置正确的选项(在javac-bootclasspath的 Cross-Compilation-Options 下)以及选项,或者仅使用完全相同的 JDK 版本。-target

从 Java 9 开始,有一个新的命令行选项可以解决这个问题:--release. 只需使用eg--release 8为Java8 进行编译,javac 就会失败并出现编译错误,如果您使用任何API,则该API 仅在更高版本中可用。