Java:在使用高版本JDK编译但在低版本上运行时阻止使用高版本API JRE

问题描述:

我正在逐渐将项目从Java 7迁移到8Java:在使用高版本JDK编译但在低版本上运行时阻止使用高版本API JRE

我想做到这一点,2步 - 迁移构建机器,然后运行时机器

但即使编译器ARG游戏设置为source=7target=7

,好像是用JAVA 8层时的API,如streams and Optional,编译仍然成功通过。显然,代码将打破ClassNotFoundException时,它将在Java 7机器上执行。

这是非常令人惊讶的。 在正确指定的低版本JRE上运行时,如何防止使用高版本的API?

找到了方法,使用了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