![](/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.