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



我想在我的产品中使用一些第三方罐子,比如saxonica。以前我们使用Oracle JDK。现在,我们将删除Oracle JDK以使用OpenJDK。我可以用同一个罐子吗。

在这种情况下,我想知道我的jar是用OracleJDK还是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版本中的"及更高版本"也是如此——欢迎您在Java版本17发布当天使用Saxon,如果您发现使用日本日历不再有效,那么我们会注意到这一事实;我们不一定会修复它,但我们不会告诉您产品(或客户或平台(不受支持。

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

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


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

是。JAR中的类是用OpenJDK和OracleJDK编译的,这应该没有什么区别。

不过需要注意的是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编译器

相关内容

最新更新