我想在我的产品中使用一些第三方罐子,例如萨克森州。之前我们曾经使用Oracle JDK。现在,我们将删除Oracle JDK以使用OpenJDK。我可以使用同一罐子吗?
在这种情况下,我想知道我的jar是使用Oracle JDK还是OpenJDK构建的?我怎么知道呢?
答案 0 :(得分:0)
由于您标记了问题“ 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与Java版本一起使用,如果发现使用日语日历已不再有效,那么我们我会注意到这个事实;我们不一定会修复它,但是我们不会告诉您该产品(或客户或平台)不受支持。
答案 1 :(得分:-1)
该类是使用OpenJDK还是Sun / Oracle JDK编译的,这并不重要。如果使用等效选项等调用,则给定的OpenJDK版本和相应的Oracle JDK版本中的Java字节码编译器应产生相同的代码 1 。编译器是从相同的源代码树构建的。
据我所知,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编译器