我已将我的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代码?根据我对this link的理解,上述设置将获得优先权,项目将使用1.6而不是1.7进行编译。这是对的吗?
如果我给出如下设置,如果我有特定于JDK 1.7的代码,我的代码现在会编译吗?
<source>1.6</source>
<target>1.7</target>
我不确定;上述设置实际意味着什么?
答案 0 :(得分:6)
<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。
的同义词的值
target
生成以指定版本的VM为目标的类文件。类文件将在指定的目标和更高版本上运行,但不会在早期版本的VM上运行。有效目标是1.1,1.2,1.3,1.4,1.5(也是5),1.6(也是6)和1.7(也是7)。 -target的默认值取决于-source:
答案 1 :(得分:4)
使用您拥有的设置,源代码将被解释为符合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>
答案 2 :(得分:0)
是的,这会将您的代码编译为Java 1.6代码(也将在Java 7环境中运行)。