使用 -source 和 -target javac 选项进行编译[重复]

问题描述 投票:0回答:3

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

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

java maven
3个回答
7
投票

无插件的编译器配置

<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 编程语言编译器 文档

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

兼容性


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>

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.