当前,我们正在使用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'

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

最佳答案

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

从Java 9开始,有一个新的命令行选项可以解决此问题: --release 。只需使用例如如果使用任何API(仅在更高版本中可用),则针对Java8和Javac进行编译的--release 8应该会失败,并出现编译错误。

10-07 19:57
查看更多