【问题标题】:Functionality of Specifying Java Compile Version with MavenMaven指定Java编译版本的功能
【发布时间】:2016-08-12 16:36:03
【问题描述】:

首先,我想承认我的头衔很丑陋。如果有人在听到我的问题后能想出一个更合适的标题然后删除这部分帖子,请随意这样做。

由于多捕获异常块,我最近在mvn clean install 期间遇到了编译错误。它的投诉error: multi-catch statement is not supported in -source 1.5。很直接。

除了我的-mvn version-java version 都在1.8 和Eclipse 中的Java Compiler 下显示1.8Java Build Pathjre1.8.X 显示我的JRE System Library

进入这篇文章:Why can't java 7 use diamond operator and multi-catch statement 并尝试了这个答案。所以在我插入的pom的<build><plugins>中:

<plugin>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>3.2</version>
     <configuration>
          <source>1.8</source>
          <target>1.8</target>
     </configuration>
</plugin>

现在构建良好。在基本层面上,我理解这传达给编译器它应该使用Java 1.8。但是怎么做?为什么在我把它放在我的pom.xml 之前,其他所有东西都设置在1.8 似乎并不重要?当我没有 multi-catch 块时,它在这个插件标签之前构建得很好,那么改变了什么?

【问题讨论】:

  • echo %JAVA_HOME% 打印什么?
  • @Jean-FrançoisSavard 实际上在发布之前的故障排除时也有同样的想法。它也是Java 8,但M2_HOME 使用Java 7 也将其切换为8。所以一切都是张贴Java 6
  • Eclipse 设置不会影响mvn 的作用或mvn 默认值,现在是1.5

标签: java maven


【解决方案1】:

默认情况下,Java(编辑:特别是在这种情况下是 Maven,而不是 javac 本身)会将代码编译为最旧的“合理”兼容版本,假定为 1.5。因此,无论您使用的是什么版本的 Java,生成的 字节码 仍然是 1.5 版本。你可以用 1.8 Java 编译和运行 1.5 版本的字节码,你不能反过来做。

当然,Java 的很多特性都是向后兼容的,所以代码可以正常编译和运行,直到您添加一些新特性(lambdas、diamonds、multi-catch 等)。然后你必须手动指定目标版本。

【讨论】:

  • Gotchya,很高兴知道。我已经看过我之前引用的插件,但不知道它在做什么以及为什么,谢谢。
【解决方案2】:

据此maven-compiler-plugindocumentation page

目前默认源设置为 1.5,默认目标设置为 1.5,与运行 Maven 的 JDK 无关。如果你想改变这些默认值,你应该设置源和目标

【讨论】:

    【解决方案3】:

    有两件不同的事情需要考虑:

    1. 您使用什么 Java 版本来编译源代码
    2. 您编译源的目标版本是什么

    您使用的 Java 版本由您的 $JAVA_HOME 环境变量决定。 Maven 使用它在那里找到的 jdk / jre,无论它是什么版本。

    对于第 2 部分,它有点棘手:每个 JDK 都能够为自己的任何版本编译源代码。使用目标级别,您是在告诉编译器运行此代码所需的最低 Java 版本。另一方面,源代码级别会告诉编译器允许在源代码中使用什么语法级别。

    如果您选择的源或目标级别高于您正在使用的 jdk/jre 级别,那么编译当然不会成功。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2019-01-10
      • 1970-01-01
      • 2022-01-23
      • 2016-12-17
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多