具有源代码 1.6 配置的 Maven 编译器插件是否识别自 1.7 以来引入的 API?

Does maven compiler plugin with source 1.6 configuration recognise API introduced since 1.7?

我有一个 maven 项目,maven-compiler-plugin 配置如下:

    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.0</version>
      <configuration>
        <source>1.6</source>
        <target>1.6</target>
      </configuration>
    </plugin>

在我的代码中,我使用了从 1.7 开始引入的 class java.nio.charset.StandardCharsets。 我很惊讶我的代码编译成功,插件不应该抛出错误因为 java.nio.charset.StandardCharsets 不是 1.6 compilant?

targetsource 都与编译器 class 路径上可用的 class 没有任何关系。如果您使用 1.7 编译器编译代码,那么 1.7 附带的任何 classes 都将可用于您的代码。

target 所做的是告诉编译器以与 java 的 1.6 版本兼容的格式输出 .class 文件。 source 说只接受 java 可以用 1.6 版编译器编译的代码。

因此,调用仅在 1.7 或更高版本上发布的 class 使用 Java 1.6 兼容源代码写入与 class 兼容的文件是完全合法的Java 1.6。它只是不会 运行 在 1.6.

确保您的代码在 1.6 上 运行 的唯一方法(如果您正在尝试这样做)是使用 1.6 JDK 来编译您的项目。