![](/img/trans.png)
[英]Maven Java compiler - compilation error using wrong compliance version
[英]Which compiler version maven is using here?
我正在使用下面的Maven编译器插件来编译我的Java代码:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<inherited>true</inherited>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
我的java_home指向Java 7。
我的第一个问题是,我的类将使用Java 6还是Java 7进行编译?
如果使用Java 6(由于<source>1.6</source>
),那么maven如何知道java 1.6作为java home指向1.7的路径?
如果需要使用Java 1.8编译源代码,是否需要将源和目标设置为1.8?
但是,然后,maven如何知道jdk 1.8即将出现?
我需要更改java_home指向Java 8吗?
简短的答案:
由于JAVA_HOME
指向Java 1.7,因此将使用Java 1.7中的javac
程序(编译器)。 但是,由于source
和target
均为1.6
,因此命令mvn compile
将生成可在JRE 1.6上运行的类。 如果您使用javap
实用工具看到了与生成的类文件相关联的主要和次要版本号,这将是显而易见的。 对于Java 1.8,这些值是52 and 0
;对于Java 1.7,它们是51 and 0
;对于Java 1.6,它们是50 and 0
。 您可能想知道为什么要Java 1.7编译器生成target = 1.6
类。 原因是基于要在其上运行类的运行时(JRE)。 如果您的编译器和运行时始终在版本上达成共识,则可以不使用这些版本,但是需要在大型团队中协调这些升级,与此同时,您应始终尽量保持与软件的最新版本(一个主要版本)保持接近。原因:您想获取错误修复程序)。 要记住的另一件事是source release 1.n requires target release 1.n
是的,将这些值<source>
和<target>
更改为1.8
(也许有一个快捷方式,但我们以后再做吧;)。 确保JAVA_HOME(和PATH)指向JDK 1.8,因为maven-compiler-plugin
最终使用来自插件的<configuration>
-source
和-target
参数委托给PATH中的javac
程序。 查看mvn -X compile
的输出,您将得到类似以下内容的信息:
[DEBUG] (f) source = 1.8
[DEBUG] (f) staleMillis = 0
[DEBUG] (f) target = 1.8
[DEBUG] (f) useIncrementalCompilation = true
[DEBUG] (f) verbose = false
[DEBUG] -- end configuration --
[DEBUG] Using compiler 'javac'.
当心来自Maven docs的以下警告:
仅设置
target
选项不能保证您的代码实际在具有指定版本的JRE上运行。 陷阱是仅在更高版本的JRE中存在的API的意外使用,这将使您的代码在运行时因链接错误而失败。 为避免此问题,您可以将编译器的引导类路径配置为与目标JRE匹配,或使用Animal Sniffer Maven插件来验证您的代码未使用意外的API。
Maven使用在JAVA_HOME中设置的JDK。 您可以在mvn.bat中设置以查找特定的JDK位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.