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

时间:2016-08-12 16:36:04

标签: java maven

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

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

我的-mvn version-java version都显示1.8,而Java Compiler下的Eclipse显示1.8Java Build Path显示我的JRE System Library jre1.8.X

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

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

现在建立好。在基本层面,我理解这与编译器通信它应该使用Java 1.8。但是怎么样?为什么在我1.8之前将其他内容设置为pom.xml似乎无关紧要?当我没有多捕获块时,它在这个插件标签之前构建得很好,所以改变了什么?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

根据此try { // supposing et_number is displayed onView(withId(R.id.et_number)).check.matches(isCompletelyDisplayed())); // will throw an exception if its not displayed onView(withId(R.id.et_number)).perform(replaceText("12345")); } catch (Exception e) { // et_number is not displayed onView(withRecyclerView(R.id.rv_country).atPosition(0)).perform(click()); } 的{​​{3}}

  

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

答案 2 :(得分:0)

有两件事需要考虑:

  1. 您使用什么Java版本来编译源
  2. 您正在编译源的目标版本
  3. 您使用的Java版本由$ JAVA_HOME环境变量决定。 Maven使用它在那里找到的jdk / jre,无论它是什么版本。

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

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