我已将 Web 应用程序升级到 Java 7,JAVA_HOME 指向 1.7。我的 Maven 插件正在从 java_home 读取 Java 版本。但在 pom.xml 中看到以下设置后我有点困惑:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<fork>true</fork>
<compilerVersion>1.6</compilerVersion>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
如果我保持上述设置不变,Maven会编译1.6或1.7的Java代码吗?根据我基于此链接的理解,上述设置将得到优先选择,并且项目将使用 1.6 而不是 1.7 进行编译。这是正确的吗?
如果我给出如下设置,并且如果我有特定于 JDK 1.7 的代码,我的代码现在可以编译吗?
<source>1.6</source>
<target>1.7</target>
我不确定;上述设置实际上意味着什么?
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
javac -help
-source <release> Provide source compatibility with specified release
-target <release> Generate class files for specific VM version
指定接受的源代码版本。允许使用以下释放值:source
- 1.6 Java SE 6 中没有引入任何语言更改。但是,源文件中的编码错误现在报告为错误,而不是像以前版本的 Java SE 那样报告为警告。
- 6 1.6 的同义词。
- 1.7 这是默认值。编译器接受具有 Java SE 7 中引入的功能的代码。
- 7 1.7 的同义词。
生成针对指定版本的 VM 的类文件。类文件将在指定目标和更高版本上运行,但不能在早期版本的 VM 上运行。有效目标为 1.1、1.2、1.3、1.4、1.5(也为 5)、1.6(也为 6)和 1.7(也为 7)。 -target 的默认值取决于 -source 的值:target
根据您的设置,源代码将被解释为兼容 Java 1.6,并且生成的类将针对 1.6 JVM。 JDK 1.7 可以处理它。但如果您的代码是 1.7 并且只想以 1.7 为目标,那么您应该在两者中都编写 1.7。请注意,如果您的源代码包含仅在 1.7 中可用的功能(例如钻石运算符),那么您将收到编译错误。
通过设置
<source>1.6</source>
<target>1.7</target>
以下1.7代码(菱形运算符)
List<String> l = new ArrayList<>();
将无法编译并出现以下错误:
... Compilation failure
... App.java:[14,40] diamond operator is not supported in -source 1.6
(use -source 7 or higher to enable diamond operator)
下面的代码可以编译得很好
List<String> l = new ArrayList<String>();
设置:
<source>1.7</source>
<target>1.6</target>
以下1.7代码(菱形运算符)
List<String> l = new ArrayList<>();
也将无法编译并出现以下错误:
source release 1.7 requires target release 1.7
因此,如果您想使用 1.7 的源功能(菱形运算符、try-with-resources 等),那么您必须在 pom.xml 中包含以下内容。
<source>1.7</source>
<target>1.7</target>
是的,这会将您的代码编译为 Java 1.6 代码(也将在 Java 7 环境中运行)。