Java 源代码为1.6配置的maven编译器插件是否识别自1.7引入的API?

Java 源代码为1.6配置的maven编译器插件是否识别自1.7引入的API?,java,maven,javac,Java,Maven,Javac,我有一个maven项目,其maven编译器插件配置如下: <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.6</source> <target>1.6&l

我有一个maven项目,其maven编译器插件配置如下:

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

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

无论是
target
还是
source
都与编译器类路径上可用的类没有任何关系。如果您使用1.7编译器编译代码,那么1.7附带的任何类都将可用于您的代码

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

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


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

即使您告诉编译器编译1.6的字节码,使用的rt.jar仍然是1.7 rt.jar;这就是为什么可以使用其中定义的类。@fge rt表示运行时,对吗?我认为应该在运行时之前抛出编译时错误,因为StandardCharsets不是1.6 sourceWell,不幸的是不会。您最好的守护者实际上是您的IDE:它应该能够正确地推断您尝试并使用JDK版本中的类,而JDK版本不是您的项目应该使用的目标版本。至少IDEA做到了这一点。确保它在1.6下运行的另一种方法是使用animal sniffer maven plugin()。@JJF但我将目标标志设置为1.6,1.7编译器是否足够聪明,可以将1.7 API编译成符合1.6的字节码,从而在1.6 JVM上运行?