为什么javac目标选项不能低于源选项?

Wor*_*tig 5 java javac maven

我已经阅读过相关内容sourcetarget选项javac,它们分别定义了我的源代码编译所需的版本和我想要支持的最旧的 JRE 版本。在使用 Maven 构建工具时,我在 pom.xml 中定义了这些参数,如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>15</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

,但是目标版本不能设置低于源版本,为什么会这样呢?

尝试使用此配置进行编译会导致错误:“编译致命错误:警告:源版本 15 需要目标版本 15”。与源版本高于目标版本的任何其他组合相同。

Her*_*cón 5

因为它就是这样设计的。来自Java SE 15 中 javac 的文档,了解 --target 选项

注意:目标版本必须等于或高于源版本。(参见--来源。)

我想通常是拥有您想要在较新版本中运行的旧源代码,并且在启动项目时,您选择源版本作为您想要支持的最旧版本。

查看此答案以获取有关向后和向前兼容性的讨论:

简而言之,我们可以说:

  • JDK(通常)是向前兼容的。
  • JRE(通常)是向后兼容的。

您可以这样想:JDK(通常)可以编译较新的版本,而 JRE(通常)可以运行较旧的版本。