2016-03-21 7 views
2

Java 7から8に徐々に移行しています。Java:上位バージョンのJDKを使用してコンパイルするときに高バージョンのJDKを使用しないで低バージョンで実行する場合

私は2つの段階でこれを行うにはしたいと思います - ビルドマシン、その後実行時のマシンを移行します。

しかし、コンパイラの引数が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> 

開発者はOptionalのように、Javaの8 APIを使用しようとしている、コンパイルは最終的にエラーで失敗します。cannot find symbol class Optional

+0

私は本当に誰かがより良いソリューションを持っていることを願っています... –

+0

[関連する質問]を参照してください(http://stackoverflow.com/questions/40087200/can-i-compile-java-for-an-older-java-新しいバージョンのant-with-a-new-jdk-so-it-gen)が含まれています。 [Animal Sniffer](http://www.mojohaus.org/animal-sniffer/animal-sniffer-maven-plugin/index.html)のようなmavenプラグインの他に、 '-bootclasspath'オプションはあなたができることの中で最高です今すぐ入手してください。そして、Java 9にするための '-release'オプションを期待してください。 – charlie

関連する問題