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

Java 如何知道类是用openjdk还是sunjdk编译的?,java,saxon,Java,Saxon,我想在我的产品中使用一些第三方罐,如saxonica。早些时候,我们使用oraclejdk。现在,我们正在删除OracleJDK以使用OpenJDK。我可以用同一个罐子吗 在本文中,我想知道我的jar是用oraclejdk还是OpenJDK构建的?我怎么知道 这个类是用OpenJDK还是Sun/Oracle JDK编译的其实并不重要。给定版本的OpenJDK和相应版本的Oracle JDK中的Java字节码编译器应生成相同的代码1(如果使用等效选项调用),等等。编译器是从同一源代码树构建的 此外

我想在我的产品中使用一些第三方罐,如saxonica。早些时候,我们使用oraclejdk。现在,我们正在删除OracleJDK以使用OpenJDK。我可以用同一个罐子吗


在本文中,我想知道我的jar是用oraclejdk还是OpenJDK构建的?我怎么知道

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

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


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

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

但需要注意的是Java版本。如果第三方jar文件支持(比如)Java7,而您试图将其与Java8(OpenJDK或Oracle)一起使用,那么您可能会遇到麻烦,并且您可能需要使用较新版本的jar。请查看支持站点以了解您所依赖的库2

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


1-文件可能不完全相同,因为字节码编译器添加了两个包含源文件和目标文件时间戳的未记录属性。在编译时,可以禁止此操作

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


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

因为您将问题标记为“Saxon”:Saxonica目前使用Oracle JDK构建发布的JAR文件,尽管由于Oracle的许可证变更,这一点在未来可能会发生变化。如果我们切换,用户就不可能分辨出其中的差别

不同JVM之间的兼容性级别非常高,我们甚至不用在多个JVM上进行测试。我不记得曾经有过这样一个bug:东西在一个JVM上工作,而在另一个JVM上工作。当然,您需要在正确的版本范围内使用JVM/JDK:Saxon 9.8适用于Java 6及更高版本,Saxon 9.9适用于Java 8及更高版本


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

一般来说,您不能。拥有广泛的JVM规范的全部意义在于,JAR在JVM实现之间是可移植的。似乎有人认为这是错误的。我不知道为什么。