8

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

不幸的是,我们使用的服务仅支持 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。

4

1 回答 1

2

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

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

于 2019-06-11T18:57:04.933 回答