繁体   English   中英

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

[英]Verify backward-compatibility on API level of a library built with a newer JDK

最近有队友在我们的Java 8代码中使用了下面的function: Matcher.replaceAll(Function replacer) The function was introduced in Java 9, but because he is using a newer compiler, the API function was simply found in the JDK's rt.jar and nobody noticed this won't work under real Java 8 environments. 兼容性设置设置正确,gradle子项目有如下设置:

sourceCompatibility = 1.8
targetCompatibility = 1.8

当我第一次在 Java 5 代码中使用 Java 6 function String.isEmpty时,我遇到了非常相似的问题。

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

正如您所注意到的,这两种兼容性配置不考虑旧版本的 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,您可以使用 select 哪个与新的--release标志一起使用。 如果您使用未记录的 API,这将不起作用,但这意味着您可以使用 Java 的任何版本编译您的项目,并且仍然使生成的类与 Java 8 兼容。您可以这样做:

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

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

对于 Java 的某些版本,可以在较新的 JDK 上构建 Java 代码以在较旧的 JDK/JRE 上运行。 您已经发现了javac--source--target选项以及相应的 Gradle 设置。 您可以做的另一件事是使用--bootclasspath告诉javac针对旧版本 Java 的运行时库进行编译。

由于您使用的是 Gradle,请查看“gradle-java-cross-compile-plugin”( https://github.com/nebula-plugins/gradle-java-cross-compile-plugin )。 我找不到任何文档,但它显然涉及--target--bootclasspath


话虽如此,我不认为交叉编译 Java 是一个好的解决方案。

我实际上建议您为您有兴趣支持的所有 Java 版本设置一个带有 JDK 安装的持续集成 (CI) 服务器(例如 Jenkins)。 然后设置作业以构建您的代码为每个 Java 版本运行您的单元测试。

请注意,仅针对较旧的 Java 库编译代码不足以验证向后兼容性。 有时库的行为会发生变化。 您需要运行测试,并且您的测试需要涵盖可能存在兼容性问题的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM