【问题标题】:Compile using -source and -target javac options [duplicate]使用 -source 和 -target javac 选项编译
【发布时间】:2014-01-18 12:48:09
【问题描述】:

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

我不确定;上面的设置究竟是什么意思?

【问题讨论】:

标签: java maven compiler-construction


【解决方案1】:

没有插件的编译器配置

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

javac -帮助

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 的值:

兼容性

【讨论】:

    【解决方案2】:

    使用您的设置,源代码被解释为与 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>
    

    【讨论】:

    • 请查看我的更新并告诉我您对此的看法
    • @MSach 请检查我的编辑。
    【解决方案3】:

    是的,这会将您的代码编译为 Java 1.6 代码(也将在 Java 7 环境中运行)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多