2015-12-21 120 views
1

我的應用程序應該在其上運行的目標系統使用Java 6.在我的開發機器上,我擁有Java 7.可以在不下載Java的情況下進行開發6?使用Java 7編譯Java 6而不安裝Java 6

我在http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html一個例子進行交叉編譯發現:

javac -source 1.6 -target 1.6 -bootclasspath C:\jdk1.6.0\lib\rt.jar -extdirs "" OldCode.java 

然而,這也需要一個rt.jar中,屬於Java的6有沒有更簡單的方式存在?

+4

你在用什麼IDE?當您的項目使用JDK 7時,您可以輕鬆地將項目語言級別設置爲6. – OPK

+1

很確定,Java 8中也存在'rt.jar ... ...但它仍然位於JRE子目錄中。 – Makoto

+0

@JasonZ:我不使用任何IDE。 – user1934428

回答

7

新的Java版本通常會同時改變Java語言(源和類文件格式)和Java API。

即使源爲新格式(這些版本分別由-target-source指定),Java編譯器也可以以舊格式發出類文件。因此,您不需要舊的編譯器來定位舊的JVM。

但是,對Java API的更改有點難以解決。最簡單的方法是使用您定位的Java版本的API進行編譯(-bootclasspath)。當然,您可能確信自己沒有使用更新的API,並跳過這一步,但唯一確定的方法實際上是針對舊運行時庫進行編譯和測試。

簡而言之,雖然交叉編譯有助於將相同的源代碼與不同的Java版本一起使用,但您應該針對您打算使用的實際Java版本進行編譯和測試,這需要舊的JRE(或JDK) 。

順便說一句,所有這些設置也可以在Java IDE中使用。例如,在日食,一會設置項目的編譯器設置的合規性水平,並相應的「JRE系統庫」添加到項目的「構建路徑」:

enter image description here

+0

使用'add the適當的「JRE系統庫」,是否將Java 6中的rt.jar添加到構建路徑中? – user1934428

+1

不,您必須替換(或「編輯」)「JRE系統庫」。我添加了一個截圖。 – meriton

0

下面的命令應該足以滿足您的要求。 'javac -source 1.6 -target 1.6 OldCode.java'

通過這個命令,你告訴編譯器應該生成與java 6兼容的類文件。任何java 7特定的都會導致編譯錯誤。關於rt.jar,您不需要具有java6特定版本。如上所述,上述命令自動確保輸出與java6兼容。

UPDATE /更正:

通過下面的鏈接去http://www.javaworld.com/article/2077388/core-java/what-version-is-your-java-code.html後很清楚爲什麼建議和重要的是要與 - 源極和/或-target標誌一起使用-bootstrap標誌。

+0

嗯....但是文檔明確指出:_You **必須指定-bootclasspath選項來指定引導類(rt.jar庫)的正確版本_。在什麼情況下我可以忽略這個限制?我不太確定'rt.jar'實際上包含了什麼。 – user1934428

+1

「rt」代表「運行時」。它包含Java API及其大部分實現。因此,根據運行時使用的相同API進行編譯是非常可取的,以免人們無意中使用目標Java版本尚不可用的API。 – meriton

+1

@ user1934428最後,我找到了一個鏈接[here](http://www.javaworld.com/article/2077388/core-java/what-version-is-your-java-code.html),它解釋了使用-bootstrap標誌並幫助回答你的問題。它還演示瞭如果未指定-bootstrap,則可以通過使用StringBuffer API作爲示例在運行時出錯。我想我需要糾正我的答案,以反映相同的情況。 –