如何指定JDK版本?
1)<java.version>
在Maven文档中未引用。
这是Spring Boot的特性。
它允许将源Java版本和目标Java版本设置为同一版本,例如,为两者指定Java 1.8:
<properties>
<java.version>1.8</java.version>
</properties>
如果您使用Spring Boot,请随时使用它。
2)使用maven-compiler-plugin
或maven.compiler.source
/ maven.compiler.target
属性指定source
和target
等效。
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
和
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
根据编译器插件的Maven文档,它们是等效的,
因为编译器配置中的<source>
和<target>
元素使用属性maven.compiler.source
以及maven.compiler.target
是否已定义属性。
资源
-source
Java编译器的参数。
默认值为:1.6
。
用户属性是:maven.compiler.source
。
目标
-target
Java编译器的参数。
默认值为:1.6
。
用户属性是:maven.compiler.target
。
关于默认值source
和 target
,注意,
因为3.8.0
maven的编译器,默认值已经从改变1.5
到1.6
。
3)maven-compiler-plugin 3.6
和更高版本提供了一种新方法:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
您也可以只声明:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
但是,由于maven-compiler-plugin
您使用的默认版本不依赖最新的版本,因此目前无法使用。
Maven release
参数传达release
:我们可以从Java 9中传递 的新JVM标准选项:
针对特定VM版本针对公共,受支持和记录的API进行编译。
这种方式提供了一种标准方法,可以为source
,target
和bootstrap
JVM选项指定相同的版本。
请注意,bootstrap
为交叉编译指定一个很好的做法,并且即使您也不进行交叉编译也不会受到损害。
哪种是指定JDK版本的最佳方法?
<java.version>
仅当您使用Spring Boot时,才允许使用第一种方式()。
对于Java 8及以下版本:
关于另外两种方式:评估maven.compiler.source
/ maven.compiler.target
属性或使用maven-compiler-plugin
,可以使用其中一种。实际上这并没有改变,因为最终两个解决方案依赖于相同的属性和相同的机制:maven核心编译器插件。
好吧,如果您不需要在编译器插件中指定Java版本以外的其他属性或行为,则使用此方法更为合理,因为这更加简洁:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
从Java 9:
该release
参数(第三点),如果你想使用相同版本的源和目标,以认真考虑的一种方式。
如果JAVA_HOME中的JDK与pom.xml中指定的JDK之间的版本不同,会发生什么?
如果所引用的JDK JAVA_HOME
与pom中指定的版本兼容,那不是问题,但是为了确保更好的交叉编译兼容性,请考虑添加bootstrap
JVM选项rt.jar
,并将target
版本的路径作为值。
要考虑的重要事项是Maven配置中的source
和target
版本不应优于所引用的JDK版本JAVA_HOME
。
JDK的较旧版本无法编译为较新的版本,因为它不知道其规范。
要根据使用的JDK获取有关源,目标和发行版支持的版本的信息,请参考java编译:源,目标和发行版支持的版本。
如何处理由JAVA_HOME引用的JDK与pom中指定的java目标版本和/或源版本不兼容的情况?
例如,如果您JAVA_HOME
引用了JDK 1.7,并且在pom.xml的编译器配置中将JDK 1.8指定为源和目标,则将出现问题,因为如所解释的,JDK 1.7不知道如何使用。
从它的角度来看,它是一个未知的JDK版本,因为它是在它之后发布的。
在这种情况下,您应该配置Maven编译器插件以这种方式指定JDK:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
<fork>true</fork>
<executable>D:\jdk1.8\bin\javac</executable>
</configuration>
</plugin>
您可以在带有maven编译器插件的示例中获得更多详细信息。
不需要询问,但是可能更复杂的情况是指定源而不是目标。根据源版本,它可能在目标中使用其他版本。规则很特别:您可以在“交叉编译选项”部分中阅读它们。
为什么package
即使未在pom.xml中指定编译器插件,在执行Maven 目标时仍会在输出中跟踪该编译器插件?
为了编译您的代码,并且更一般地执行Maven目标所需的所有任务,Maven需要工具。因此,它使用Maven核心插件(您可以通过groupId
:识别Maven核心插件org.apache.maven.plugins
)来完成所需的任务:用于编译类的编译器插件,用于执行测试的测试插件等等,因此,即使您没有声明这些插件,它们将绑定到Maven生命周期的执行。
在您的Maven项目的根目录下,您可以运行命令:mvn help:effective-pom
以获得有效使用的最终pom。您可以看到其他信息,包括Maven附带的插件(在pom.xml中指定或未指定),以及使用的版本,它们的配置以及生命周期每个阶段的执行目标。
在mvn help:effective-pom
命令的输出中,您可以在<build><plugins>
元素中看到这些核心插件的声明,例如:
...
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
...
在Maven文档中介绍Maven lifeycle时,您可以了解有关它的更多信息。
但是,您可以在要将这些插件配置为其他值作为默认值时声明这些插件(例如,当您在pom.xml中声明maven-compiler插件以调整要使用的JDK版本时,便进行了声明)。想要添加一些在Maven生命周期中默认不使用的插件执行。
<maven.compiler.x>
从现在开始将坚持使用该属性。