gpt4 book ai didi

java - 验证使用较新的 JDK 构建的库的 API 级别的向后兼容性

转载 作者:行者123 更新时间:2023-12-01 19:35:03 26 4
gpt4 key购买 nike

最近,一位队友在我们的 Java 8 代码中使用了以下函数:Matcher.replaceAll​(Function replacer) 。该函数是在 Java 9 中引入的,但由于他使用的是较新的编译器,API 函数只是在 JDK 的 rt.jar 中找到,没有人注意到这在真正的 Java 8 环境下不起作用。兼容性设置正确,gradle子项目有如下设置:

sourceCompatibility = 1.8
targetCompatibility = 1.8

当我第一次在 Java 5 代码中使用 Java 6 函数 String.isEmpty 时,我遇到了非常类似的问题 - 该代码进入了发行版并在那里崩溃了。

我可以做什么来强制使用正确的 API。由于它是一个共享库,我是否必须为这个 gradle 子项目使用(并安装、维护..)不同的 JDK,或者是否有某种兼容性扫描仪可以通过构建的 jar 运行并检查所有 rt 引用? p>

最佳答案

正如您所注意到的,这两种兼容性配置不考虑旧版本的 API - 仅考虑语法、语义和生成的字节代码。

您可以采取两种选择。一种是在计算机上安装 JDK 8,并配置 Gradle 以在编译项目时使用它。它看起来像这样:

tasks.withType(JavaCompile) {
options.fork = true
options.forkOptions.executable = "$java8Home/bin/javac"
options.bootstrapClasspath = files("$java8Home/jre/lib/rt.jar")
}

这里的缺点是您需要首先安装 JDK 8,并且由于它可能会安装在不同的位置,因此您可能需要使用环境变量或属性来配置它(我已经此处将其称为 java8Home)。

但是,从 Java 9 开始,JDK 现在了解以前版本的已记录 API,并且您可以通过新的 --release 标志选择要使用的 API。如果您使用未记录的 API,这将不起作用,但这意味着您可以使用任何版本的 Java 编译您的项目,并且仍然使生成的类与 Java 8 兼容。您可以这样做:

tasks.withType(JavaCompile) {
if (JavaVersion.current() > JavaVersion.VERSION_1_8) {
options.compilerArgs.addAll(['--release', '8'])
}
}

请注意,“if”语句仅在您仍然需要支持使用 Java 8 运行 Gradle(通过您的 JAVA_HOME 变量)时才存在。如果您只使用更高版本,则可以将其删除,以便您始终设置“compilerArgs”。

关于java - 验证使用较新的 JDK 构建的库的 API 级别的向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58165833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com