我们目前正在使用 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。