2011-10-21 38 views
13

我最近在我的一個項目中轉移到了Java 7。我聲稱,它可以在Java 1.5的運行僅僅是因爲今天我注意到這個編譯然而,當我沒有什麼取決於是用Java 6或7:在Java 1.7上編譯爲Java 1.5還會工作嗎?

bootstrap class path not set in conjunction with -source 1.5 

谷歌已經發現了這樣的警告信息很少。這是否意味着您無法從Java 1.7編譯爲Java 1.5?

+0

不確定有關錯誤消息,但是我會進行單元測試,它會自動針對我聲稱支持的每個重要(1.x)版本的Java運行。 –

回答

13

此Oracle博客解釋了警告:

http://blogs.oracle.com/darcy/entry/bootclasspath_older_source

的原因是,如果你沒有設置的rt.jar對於上了年紀的平臺,那麼:

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

6
  1. 您最好設置-source和-target 1.5。

  2. 爲了確保您不會意外地將依賴關係合併到較新的類,方法或字段,請使用maven-animal-sniffer插件或類似的東西。

+2

+1,因爲我以前從來沒有聽說過maven-animal-sniffer,並希望我做過很多次。 (大學任務測試環境,10年未更新= argh。) – millimoose

+2

我認爲還建議設置'-target 1.5'。我認爲classfile格式的版本號在1.5到1.6之間,所以1.5個虛擬機可能無法加載它們。 (即使不是,比對不起更安全。) – millimoose

+0

如果指定了'-source'和'-target',則1.7編譯器會提示輸入「-xbootclasspath」 - 這代表了第2點。 –

12

這是否意味着您無法從Java 1.7編譯爲Java 1.5?

不,它不。這意味着有一個正確的方法和一個錯誤的方式來做到這一點......而你正在做錯誤的方式。

編譯爲Java 1.5的Java JDK 1.7正確的方法是:

  • 的從Java 1.5「的rt.jar」的副本弄個並把它編譯引導類路徑。

  • 使用-source 1.5和-target 1.5進行編譯。

警告消息告訴你,你還沒有完成第一個。


您現在正在構建的方式隱式地將1.7版本的「rt.jar」用於Java運行時API。這可能工作! (的確,應該的工作原理是假設自上次構建1.5以來,對代碼沒有做任何更改。)但是,您可能會無意中引入對Java 1.6或1.7中添加的類或方法的依賴關係。當您嘗試在Java 1.5上運行應用程序時,這會導致運行時錯誤。

2

--source 1.5將確保源文件符合Java 5慣例。 --target 1.5將確保生成的類文件符合Java 5慣例。這些都不會保護您不使用Java 6或7庫方法。您必須使用--bootclasspath對相應的rt.jar進行編譯,或者使用像animal-sniffer-plugin(如果使用maven)的東西來檢查所有類型的簽名,並與已發佈的配置文件進行比較。

使用動物嗅探器插件,您可能會喜歡,因爲您可能會遇到使用Java 6 API的第三方庫,這可能會導致您的構建過程在Java 5中發生故障。