繁体   English   中英

用Maven指定Java编译版本的功能

[英]Functionality of Specifying Java Compile Version with Maven

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

由于多捕获异常块,我最近在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

进入这篇文章: 为什么java 7不能使用diamond运算符和multi-catch语句并尝试了这个答案。 所以在我的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似乎并不重要? 当我没有多捕获块时,它在此插件标记之前构建得很好,所以改变了什么?

默认情况下,Java(编辑:具体而言,在本例中为Maven,而不是javac本身)将代码编译为最旧的“合理”兼容版本,假定为1.5。 因此,无论您使用的Java版本如何,生成的字节码仍将具有1.5版本。 你可以用1.8 Java编译和运行1.5版本的字节码,你只能做不到的反过来。

当然,Java的许多功能都是向后兼容的,因此代码将编译并运行得很好,直到您添加一些新功能(lambdas,diamond,multi-catch等)。 然后,您必须手动指定目标版本。

根据这个maven-compiler-plugin文档页面

目前,默认源设置为1.5,默认目标设置为1.5,与您运行Maven的JDK无关。 如果要更改这些默认值,则应设置源和目标

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM