使用-source和-target javac选项进行编译

时间:2014-01-18 12:48:09

标签: java maven compiler-construction

我已将我的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>

我不确定;上述设置实际意味着什么?

3 个答案:

答案 0 :(得分:6)

没有插件的编译器配置

<properties>
  <maven.compiler.source>1.7</maven.compiler.source>
  <maven.compiler.target>1.7</maven.compiler.target>
</properties>

javac -help

javac -help

  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version

javac - Java programming language compiler文档

  

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环境中运行)。