我們有一個我們希望分發給用戶的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。但是後來出現了兩個問題:
- 如果我們下載JDK 1.6,那麼我們不妨使用它來代替JDK 1.7編譯;
- 如果我們希望爲Java 1.5進行交叉編譯,那麼JDK 1.5將不再可供下載。
那麼,我們究竟要如何指定-bootclasspath
選項可使用此交叉編譯功能?
1)右鍵2)嘗試http://www.oracle.com/technetwork/java/archive-139210.html –
@Gyro:謝謝,存檔鏈接很有幫助。儘管如此,問題依然存在:如果舊的JDK必須被下載,那麼正確使用交叉編譯功能是什麼? – asaveljevs