如何知道一个类是用openjdk还是sunjdk编译的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何知道一个类是用openjdk还是sunjdk编译的?相关的知识,希望对你有一定的参考价值。
我想在我的产品中使用像saxonica这样的第三方罐子。之前我们曾经使用过Oracle JDK。现在,我们正在删除Oracle JDK以使用OpenJDK。我可以使用同一个罐子吗?
在这种情况下,我想知道我的jar是用Oracle JDK还是OpenJDK构建的?我怎么知道呢?
由于您标记了问题“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版本中的“及更高版本” - 欢迎您在发布当天使用Saxon和Java版本17,如果您发现使用日文日历不再有效,那么我们'请注意这个事实;我们不一定会修复它,但我们不会告诉您产品(或客户或平台)不受支持。
这个类是用OpenJDK还是Sun / Oracle JDK编译的并不重要。 OpenJDK的给定版本中的Java字节码编译器和相应的Oracle JDK版本应该生成相同的code1(如果使用等效选项调用,等等)。编译器是从相同的源代码树构建的。
此外,据我所知,OpenJDK和Oracle JDK编译器不会将此信息放入编译类中。深入研究OpenJDK / Oracle JDK 8的源代码树确认了这一点。标准javac编译器3没有发出相关的未记录的属性。
我可以使用相同的(第三方)罐子吗?
是。使用OpenJDK和Oracle JDK编译JAR中的类应该没有区别。
但需要注意的是Java版本。如果第三方jar文件支持(比如说)Java 7并且你试图将它与Java 8(OpenJDK或Oracle)一起使用,那么你可能会遇到麻烦,你可能需要使用更新版本的jar。检查支持站点以查找您依赖的库2。
而且...当然......你应该彻底测试你的应用程序,以找出可能(假设)可归因于更改为OpenJDK的任何问题。
1 - 文件可能不是逐字节相同的,因为字节码编译器添加了一些包含源文件时间戳和目标文件时间戳的未记录的属性。编译时可以抑制这种情况。
2 - 您可能会发现库供应商只会为Oracle JDK认证其库。如果您发现这种情况,您应该直接与他们交谈以了解其原因,以及对您使用该库的影响。这可能只是一个短期问题。 (如果供应商长期拒绝支持OpenJDK或Oracle JDK,他们将失去相当大比例的客户。)
3 - 我含糊地回忆起旧的GNU Jikes编译器过去常常将其他非标准属性放入“.class”文件来识别编译器,但这无助于区分Oracle JDK和OpenJDK编译器。
以上是关于如何知道一个类是用openjdk还是sunjdk编译的?的主要内容,如果未能解决你的问题,请参考以下文章
linux下如何使用自己安装的SunJDK替换默认的OpenJDK