我使用下面的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编译源代码,是否需要将source和target设置为1.8?
但是,maven会怎么知道jdk 1.8正在路径中?
我是否需要将java_home更改为指向java 8?
答案 0 :(得分:5)
简答:
由于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
最终委托PATH中的javac
程序,其-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'.
请注意来自Maven docs的以下警告:
仅设置
target
选项并不能保证您的代码实际上在具有指定版本的JRE上运行。缺陷是无意中使用的API,这些API仅存在于以后的JRE中,这会使您的代码在运行时因链接错误而失败。要避免此问题,您可以配置编译器的引导类路径以匹配目标JRE,或使用Animal Sniffer Maven Plugin验证您的代码不使用非预期的API。
答案 1 :(得分:-1)
Maven使用在JAVA_HOME中设置的JDK。您可以在mvn.bat中设置以查找特定的JDK位置。