Java:在使用高版本JDK编译但在低版本上运行时阻止使用高版本API JRE
问题描述:
我正在逐渐将项目从Java 7迁移到8。Java:在使用高版本JDK编译但在低版本上运行时阻止使用高版本API JRE
我想做到这一点,2步 - 迁移构建机器,然后运行时机器。
但即使编译器ARG游戏设置为source=7
和target=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
。
我真的希望有人有更好的解决方案... –
请参阅[相关问题](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