【发布时间】:2019-06-10 18:28:46
【问题描述】:
我们目前正在使用 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。
【问题讨论】:
-
你试过在 IntelliJ 上寻找吗?我知道他们有一些开源项目,也许,只是也许,他们将分析器作为一个独立的库?
-
另外,我认为有一些 Maven 插件可以解决您的问题,但我不知道它们,必须搜索它们。
-
最安全的解决方案是尽可能使用 JDK 8 编译 Java 8 代码
-
也许我在这里误解了这个问题,但你的问题不是简单地解决了by specifying the
-sourceparameter to javac吗?也就是在编译代码的时候指定-source 8还是-source 11?当 Java 编译器完全按照您的要求执行时,为什么要使用 grep 或任何这些实用程序? (即,如果代码使用 Java 8 之后引入的 API 功能,则无法编译在 Java 8 上运行的代码)。所有主要的 IDE 都允许您在构建代码时指定 -source 的值。 -
@skomisa 问题是
-source 8编译得很好,因为源代码在语法上与 Java 8 兼容。然后,如果您使用 *jdk-8 执行类,它将失败,因为 @987654328 @(例如),不存在。--release 8是解决方案。
标签: java checkstyle pmd spotbugs