gpt4 book ai didi

java - 使用更高版本的JDK编译时如何验证依赖项的java版本?

转载 作者:行者123 更新时间:2023-11-30 06:01:22 25 4
gpt4 key购买 nike

我们对大多数模块/项目使用 java 8,但对于某些模块,我们使用 java 6(客户要求)。

开发人员安装了 java 8,我们使用这些标志编译 java 6 项目:

compileJava {
sourceCompatibility = 1.6
targetCompatibility = 1.6
}

在将 Guava 从 v20 升级到最新版本 - 28.1-jre 之前,我们认为一切都很好。

令我们惊讶的是,构建成功但在运行时失败。

我们有一个使用 JDK 6 中的特定 javac 构建 java 6 的解决方法。查看更多信息 here .此解决方法使用错误 class file has wrong version 52.0, should be 50.0 in compile time。缺点是它需要为开发人员下载+配置+使用 JDK 6。

有没有办法在编译时使用更高版本的 java 验证依赖项的 java 版本?(无需安装较低版本的 java)谢谢。

最佳答案

-source-target 值设置为 1.6 不足以确保生成的输出与 1.6 兼容。程序本身不能对更高版本有任何库 API 依赖性,-source-target 选项不会这样做。 (GhostCat 说的差不多。)

例如,在 Java 8 中,ConcurrentHashMapkeySet 添加了协变覆盖返回新类型 ConcurrentHashMap.KeySetView 的方法。这种类型在早期版本的 Java 中不存在。但是,在二进制类中,返回类型是在调用站点编码的。因此,即使源代码是使用 -source 1.6 -target 1.6 编译的,生成的类文件也包含对 Java 8 类库 API 的依赖。

对此的唯一解决方案是确保在编译时类路径中只有 Java 1.6 兼容库。这可以使用 -Xbootclasspath 选项指向 JDK 1.6 类库来完成,或者首先使用 JDK 1.6 安装可能更简单。

这适用于 JDK 之外的外部库,正如您在 Guava 中发现的那样。 Animal Sniffer项目为 Ant 和 Maven 提供插件,用于检查库依赖性是否存在版本问题。副手我不知道 Gradle 是否有类似的东西。可能有一种方法可以让 Animal Sniffer 与 Gradle 一起工作,但我没有这方面的经验。

关于java - 使用更高版本的JDK编译时如何验证依赖项的java版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841823/

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