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=7target=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.