2014-03-04 32 views
8

我們有一個我們希望分發給用戶的Java項目。它不會使用Java 1.5以外的任何Java特性,所以我們希望它能夠在Java 1.5及更高版本上運行。在舊版Java交叉編譯時,在哪裏可以找到引導類?

在這一點上,你可能會正確地注意到Java 1.6是目前最早的可用的,所以爲什麼要定位Java 1.5?但是,這並沒有改變舊版本交叉編譯問題的一般性質。

所以,一個方式通常開始交叉編譯嘗試通過指定-source 1.5-target 1.5選項javac,此時一個獲得著名的警告有關-bootclasspath未設置:

$ javac -source 1.5 -target 1.5 Test.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.5 
1 warning 

現在,根據Oracle blog post,以及official documentation,對於交叉編譯正確的做法是:

要使用javac JDK從N到交叉編譯器的舊平臺版本中,正確的做法是:

  • 使用較老的來源設置。
  • 將bootclasspath設置爲針對舊版平臺的rt.jar(或同等版本)進行編譯。

如果第二個步驟是不採取,javac的將盡職盡責地使用舊的語言規則與新庫相結合,這可能會導致類文件不舊的平臺上,因爲不存在的方法引用工作可以得到包括在內。

例如,引用官方文檔:

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

這是偉大的,對堆棧溢出和因特網的其餘部分已經回答了兩個,很多次。

但是,我們發現的資源中沒有一個似乎表明在舊版本的Java中實際找到rt.jar的位置。作爲一個例子,JDK 1.7不只是自己的rt.jar船舶:

$ find jdk-1.7.0_45 -name rt.jar 
jdk-1.7.0_45/jre/lib/rt.jar 

這讓人想到的是,爲了獲得rt.jar對Java 1.6,例如,一個需要下載JDK 1.6。但是後來出現了兩個問題:

  1. 如果我們下載JDK 1.6,那麼我們不妨使用它來代替JDK 1.7編譯;
  2. 如果我們希望爲Java 1.5進行交叉編譯,那麼JDK 1.5將不再可供下載。

那麼,我們究竟要如何指定-bootclasspath選項可使用此交叉編譯功能?

+0

1)右鍵2)嘗試http://www.oracle.com/technetwork/java/archive-139210.html –

+2

@Gyro:謝謝,存檔鏈接很有幫助。儘管如此,問題依然存在:如果舊的JDK必須被下載,那麼正確使用交叉編譯功能是什麼? – asaveljevs

回答

0

這種類型的彙編主要是由需要來定位JRE已在生產動機上的鏈接中找到或一個以其他方式安裝的IME。在這種情況下,將JRE bootclasspath文件從現有安裝中提取出來並從構建系統中提供它們將是第一項任務。您指定的bootclasspath值將取決於您在該步驟中放置JRE bootclasspath文件的位置。可能需要更多的文件,而不僅僅是rt.jar。例如,針對IBM Java 6時。

+0

您能分享IBM Java 6需要哪些文件嗎? –

+0

vm.jar,java.util.jar,rt.jar,xml.jar,security.jar,ibmseefw.jar,annotation.jar,beans.jar,jndi.jar是我用過的,但您可能需要更多的依賴於你的程序使用了多少標準庫。 –

3

rt.jar包含在JRE中。如果您擁有JDK 1.6和JRE 1.5,則可以執行交叉編譯。

使用您的JDK 1。6:

$ javac -source 1.5 -target 1.5 -bootclasspath jre1.5.0/lib/rt.jar Test.java 

這裏的優點是JRE的大小可以小到完整JDK的1/3。您通常可以刪除舊的JDK版本而不刪除舊的JRE版本。

如果你需要得到一箇舊JRE的時候,就可以按照Java歸檔頁http://www.oracle.com/technetwork/java/javase/archive-139210.html

相關問題