为了账号安全,请及时绑定邮箱和手机立即绑定

如何知道一个类是用 openjdk 还是 sunjdk 编译的?

如何知道一个类是用 openjdk 还是 sunjdk 编译的?

饮歌长啸 2022-03-10 10:52:36
我想在我的产品中使用一些第三方罐子,比如 saxonica。之前我们使用 Oracle JDK。现在,我们正在删除 Oracle JDK 以使用 OpenJDK。我可以用同一个罐子吗?在这种情况下,我想知道我的 jar 是用 Oracle JDK 还是 OpenJDK 构建的?我怎么知道呢?
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

由于您将问题标记为“Saxon”:Saxonica 目前使用 Oracle JDK 构建已发布的 JAR 文件,但由于 Oracle 的许可变更,这可能会在未来发生变化。如果我们确实切换,用户应该无法区分。

不同 JVM 之间的兼容性水平如此之高,以至于我们甚至不用费心在多个 JVM 上进行测试。我不记得曾经有过在一个 JVM 上运行而不在另一个 JVM 上运行的错误。当然,您需要使用正确版本范围内的 JVM/JDK:Saxon 9.8 与 Java 6 及更高版本一起使用,Saxon 9.9 与 Java 8 及更高版本一起使用。

@StephenC 谈到了有关支持哪些平台和不支持哪些平台的供应商政策。在 Saxonica,这从来不是一个支持/不支持的二元决策。如果您发现我们可以在实验室中重现的问题,那么我们会尽力解决;如果您发现只能通过使用某些特殊平台来重现的问题,那么我们会告诉您我们无法修复它:但这并不意味着您“不受支持”。这同样适用于 Java 版本中的“和更高版本”——欢迎您在 Java 版本 17 发布之日使用 Saxon,如果您发现使用日本日历不再有效,那么我们会注意到这个事实;我们不一定会修复它,但我们不会告诉您产品(或客户或平台)不受支持。


查看完整回答
反对 回复 2022-03-10
?
四季花海

TA贡献1811条经验 获得超5个赞

这个类是用 OpenJDK 还是 Sun / Oracle JDK 编译的,这并不重要。给定版本的 OpenJDK 和相应的 Oracle JDK 版本中的 Java 字节码编译器应该生成相同的代码1,如果使用等效选项等调用的话。编译器是从相同的源代码树构建的。

此外,据我所知,OpenJDK 和 Oracle JDK 编译器不会将此信息放入已编译的类中。深入研究 OpenJDK / Oracle JDK 8 的源代码树证实了这一点。标准 javac 编译器3没有发出相关的未记录属性。


我可以使用相同的(第 3 方)罐子吗?

是的。使用 OpenJDK 和 Oracle JDK 编译 JAR 中的类应该没有区别。

需要注意的是 Java版本。如果第 3 方 jar 文件支持(比如说)Java 7,并且您尝试将它与 Java 8(OpenJDK 或 Oracle)一起使用,那么您可能会遇到麻烦,您可能需要使用更新版本的 jar。检查您所依赖的库的支持站点2

而且......当然......您应该彻底测试您的应用程序,以确定可能(假设)可归因于更改为 OpenJDK 的任何问题。


1 - 由于字节码编译器添加了一些包含源文件和目标文件时间戳的未记录属性,因此文件可能不是逐字节相同的。编译时可以抑制这种情况。

2 - 您可能会发现库供应商只会针对 Oracle JDK 认证他们的库。如果您发现这种情况,您可能应该直接与他们交谈以了解其原因以及对您使用该库的影响。这只能是一个短期问题。(如果供应商长期拒绝支持 OpenJDK 或 Oracle JDK,他们将有可能失去相当大比例的客户。)

3 - 我隐约记得旧的 GNU Jikes 编译器曾经将其他非标准属性放入“.class”文件中以识别编译器,但这无助于区分 Oracle JDK 和 OpenJDK 编译器。


查看完整回答
反对 回复 2022-03-10
  • 2 回答
  • 0 关注
  • 320 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号