emi*_*lly 6 java compilation maven
我使用下面的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>
Run Code Online (Sandbox Code Playgroud)
我的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最终委托javacPATH中的程序-source和-target来自插件的参数<configuration>.看到输出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'.
Run Code Online (Sandbox Code Playgroud)
请注意Maven文档中的以下警告:
仅设置该
target选项并不能保证您的代码实际上在具有指定版本的JRE上运行.这种陷阱是无意中使用的API,它只存在于以后的JRE中,这会使您的代码在运行时因链接错误而失败.要避免此问题,您可以配置编译器的引导类路径以匹配目标JRE,也可以使用Animal Sniffer Maven插件验证代码是否使用非预期的API.