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