2016-03-21 98 views
2

我正在逐漸將項目從Java 7遷移到8Java:在使用高版本JDK編譯但在低版本上運行時阻止使用高版本API JRE

我想做到這一點,2步 - 遷移構建機器,然後運行時機器

但即使編譯器ARG遊戲設置爲source=7target=7

,好像是用JAVA 8層時的API,如streams and Optional,編譯仍然成功通過。顯然,代碼將打破ClassNotFoundException時,它將在Java 7機器上執行。

這是非常令人驚訝的。 在正確指定的低版本JRE上運行時,如何防止使用高版本的API?

回答

3

找到了方法,使用了bootclasspath功能。

在構建機器中,雖然構建是由Java 8編譯器完成的,但我指定了-bootclasspath param,提供了Java 7 rt.jar。

實施例(原始):

javac <all-other-params> -bootclasspath /usr/alik/jdk1.7.0_21-rt.jar 

Maven的例子:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.1</version> 
    <configuration> 
     <source>7</source> 
     <target>7</target> 
     <compilerArguments> 
      <bootclasspath>/usr/alik/jdk1.7.0_21-rt.jar</bootclasspath> 
     </compilerArguments> 
    </configuration> 
</plugin> 

當開發者嘗試使用一個Java 8 API,像Optional,編譯最終失敗,錯誤:cannot find symbol class Optional

+0

我真的希望有人有更好的解決方案... –

+0

請參閱[相關問題](http://stackoverflow.com/questions/40087200/can-i-compile-java-for-an-older-java-版本與 - 螞蟻與-A-新盤jdk那麼這根)。除了[動物嗅探器](http://www.mojohaus.org/animal-sniffer/animal-sniffer-maven-plugin/index.html)這樣的Maven插件外,'-bootclasspath'選項是最好的現在得到。希望'-release'選項能夠進入Java 9。 – charlie

相關問題