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

Is there a way to lint incompatible Java API references with PMD, Checkstyle, SpotBugs, etc?

我们目前正在使用 Java 编译器 11,并将我们的主要工件部署到 Java 11。这里没问题。

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

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

后者很容易通过简单的 grep 语句识别,但后者比较棘手,需要理解 code/AST.

我检查了 Checkstyle、Spotbugs 和 PMD 的文档,但没有成功。 IntelliJ 其实很擅长这个,但是它不能集成到我们的 CI 管道中。

我们得到了这个 naive/simplistic grep 语句:

grep --recursive --extended-regexp '[ \(](List|Set|Map).of' 'our_project'

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

在 Java 9 之前,您需要使用 Animal Sniffer Plugin or configure the correct -bootclasspath for javac (Under Cross-Compilation-Options on javac) 和 -target 选项,或者只使用完全相同的 JDK 版本。

从Java9开始,有一个新的命令行选项解决了这个问题:--release。只需使用例如--release 8 为 Java8 编译,如果您使用任何 API,则 javac 应该会因编译错误而失败,这仅在更高版本中可用。