![](/img/trans.png)
[英]Is it possible to compile java using Oracle JDK and run the code on OpenJDK?
[英]Will java code compiled using OpenJDK always run on Oracle's Hotspot or vice versa?
javac
不是特定于供应商的,但是不同的编译器可能会有不同的错误,这可能会导致差异。
更重要的是可用的内置库,特别是开发人员不打算使用的esp类。 例如,直到Oracle JDK中的Java 6更新18,sun.misc.Unsafe.copyMemory(5 args)才存在,并且仅在OpenJDK的最新更新中可用。 AFAIK,它在IBM JVM中不可用。
一次写入,可在任何地方运行意味着一次编译,可在任何地方运行。 例如,只要为每个系统重新编译C ++,就可以编写一次,并且可以在任何地方运行。
编译Java代码后,它将在具有您使用的库的任何系统上运行。
使用OpenJDK编译的Java代码是否将始终在Oracle的Hotspot上运行,反之亦然?
如果它们是相同版本,则是。
但是,如果您在Java 7上编译并尝试在Java 6或更早版本上运行,则会遇到问题(除非您适当地使用-target开关)。
不同版本的Java之间,Java语言和Java编译器对JLS的解释也有所不同。 但是这些差异通常会导致编译错误,而不是导致不同的代码。
实际上,OpenJDK和Oracle JDK非常接近。 实际上,对于匹配的版本,我希望各个javac
编译器生成的字节码实际上是相同的。 当然,对一个代码库进行的编译器错误修复将移植到另一个代码库,并且字节码编译器中的代码生成错误非常少见。 生成的字节码中的其他差异(即不是由于错误)不太可能影响正确编写的程序的行为。
可以肯定地说:“ Java是“一次编写即可在任何地方运行”,只要javac编译器和JVM来自同一供应商? ”
嗯...不 不同平台的Java行为有所不同。 即Windows上的Java和Linux上的Java在某些方面表现不同。 其中一些差异直接归因于平台本身。 例如,在Windows和Linux上,路径名语法和文件锁定是不同的。 其他原因则是由于从Java到平台的不同本机窗口系统的映射问题。
这些差异与编译器或代码生成无关。
最好的答案是“取决于情况”。 生成不同的字节码不一定会生成错误的字节码。 请记住,您参考的第一个文档是关于OpenJDK 6和Oracle JDK 6的。那时,OpenJDK和Oracle JDK实际上常常是微妙的不兼容,因为Oracle并未像使用JDK 7那样将两个JDK项目整合在一起。现在它们几乎是相同的代码库,但在7之前不是这种情况。
坐在用OracleJDK编译的jar文件上,该文件在该系统上运行。 当我尝试在安装了OpenJDK的情况下在我的计算机上运行它时,它拒绝运行。 并且不断给我一个缺少的类错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.