2015-04-22 33 views
1

在與其他人的對話中,他們聲稱用於編譯代碼的JDK版本與用於運行編譯代碼的JVM版本無關。JDK版本是否用於編譯代碼問題?

這對我來說似乎很奇怪 - 是否從未出現JDK版本很重要的情況?功能是否始終只取決於運行代碼的JVM,而不取決於編譯代碼的方式?

https://stackoverflow.com/a/19554706/2687324談論向後兼容性。 Java代碼是否也向前兼容?

+1

您是否在談論編譯時*不使用'-target'或'-source'的情況? –

+0

我無法確認 - 別人正在編寫代碼。此外,即使他們確實使用了這些標籤,他們也不知道要使用什麼值,因爲他們從來沒有問過...... – neverendingqs

回答

5

不,您無法在舊的JRE上運行使用新JDK編譯的代碼。編譯的類包含類文件格式的版本號;如果這比運行期望更新,它將拒絕加載該類。

大多數Java編譯器都支持針對舊JRE的選項,從而生成比編譯器更早的類文件格式。但是,如果您不針對較舊版本的Java運行時庫進行編譯,仍然可能遇到麻煩。您的代碼可能會使用不在舊版Java中的新API。編譯器及其當前版本的API即使在指定較舊的目標時也不會捕獲。

對於OpenJDK中的標準javac編譯器,這些選項是-target-bootclasspath。您可能還需要設置-source選項來捕獲較新的語言功能,這些功能需要舊版類文件不提供的支持。

+0

因此,使用什麼JDK版本來編譯代碼並不重要?我正在尋求風險最小化 - 這是否意味着最好使用相同的JDK版本來編譯代碼作爲運行代碼的JVM版本(或者至少是相同的主要版本)? – neverendingqs

+0

'-target'選項得到了很好的支持並經常使用。我無法評估你的風險。如果您擔心反應堆崩潰,那麼您應該在隨JDK發佈的JRE上運行代碼。但是當面臨不太可怕的後果時,'-target'是一種公認​​的做法。 – erickson

+0

我從這個人那裏得到了編譯後的代碼,他們表示,我使用的是什麼JDK版本並不重要。我懷疑他們沒有爲我使用的JVM版本使用'-target',因爲他們從來沒有問過。 – neverendingqs