Java: 在使用高版本 JDK 但在低版本 JRE 上 运行 编译时防止使用高版本 API
Java: prevent using high version APIs when compiling using a high version JDK but running on a low version JRE
我正在逐步将工作中的项目从 Java 7 迁移到 8。
我想分两步完成此操作 - 迁移 构建机器,然后迁移 运行-time 机器.
但是
即使编译器参数设置为source=7
和target=7
,似乎在使用JAVA 8个API时,如streams and Optional
,编译仍然成功.显然,当代码在 Java 7 机器上执行时,它会被 ClassNotFoundException
打断 。
这很令人惊讶。 运行在正确指定的低版本 JRE 上运行时,如何防止使用高版本 API?
找到了一个方法,使用 bootclasspath
功能。
在构建机器中,虽然构建是由 Java 8 编译器完成的,但我指定了 -bootclasspath 参数,提供 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
.
我正在逐步将工作中的项目从 Java 7 迁移到 8。
我想分两步完成此操作 - 迁移 构建机器,然后迁移 运行-time 机器.
但是
即使编译器参数设置为source=7
和target=7
,似乎在使用JAVA 8个API时,如streams and Optional
,编译仍然成功.显然,当代码在 Java 7 机器上执行时,它会被 ClassNotFoundException
打断 。
这很令人惊讶。 运行在正确指定的低版本 JRE 上运行时,如何防止使用高版本 API?
找到了一个方法,使用 bootclasspath
功能。
在构建机器中,虽然构建是由 Java 8 编译器完成的,但我指定了 -bootclasspath 参数,提供 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
.