如何在Spring/Spring Boot pom.xml中指定Java版本?
将Java 11指定为在Spring(或Spring Boot)pom.xml文件中使用的版本的正确方式是什么?
即,我需要在pom的java.version
属性中输入什么值?
对于Java 8,我们使用1.8
,就像the documentation shows一样,对于Java 9,它是1.9
。
我不确定Java 11是否会是1.11
(尽管它似乎不太可能),我看到它在使用maven-compiler-plugin
时只是指定为11
,但我没有使用编译器插件。
例如
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
我到处搜索,但都找不到答案,因为我读过的几乎所有文档以及与Java版本相关的博客文章都只显示版本8或9。
那么我应该使用什么?1.11
还是只使用11
?
我两个都试过了,我的Web服务器似乎正确启动和正确编译(IntelliJ显示Information:javac 11.0.2 was used to compile java sources
),但我不完全相信更改java.version
值有什么作用,因为我可以将其设置为例如100
,一切正常。
我能找到的唯一相关问题是:Minimum Spring version compatible with Java 11、Spring Boot fails due to a Hibernate error after migrating to JDK 11和Spring 4.3.x with OpenJDK 11,但它们并没有真正揭示任何问题。
解决方案
简短回答:
正确的方法是对不同的Java版本使用<java.version>
中的下列值:
- Java 8:1.8或8
- Java 9:9
- Java 10:10
- Java 11:11
- Java 12:12
- .....
- .....
- Java 16:16
- Java 17:17
因此,对于Java 11,应该是:
<properties>
<java.version>11</java.version>
</properties>
然而,我不确定Java 11是否会是1.11&q;(似乎不太可能),以及 我看到它在使用maven-编译器-plugin时被指定为11&q; 但是,我没有使用编译器插件。
实际上,它最后仍然使用maven-compiler-plugin
进行编译。SpringBoot只配置一个<java.version>
属性,这样通过更改此值,您就隐式地将maven-compiler-plugin
的<source/>
和<target/>
更改为与<java.version>
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source> <!-- same as <java.version> -->
<target>11</target> <!-- same as <java.version> -->
</configuration>
</plugin>
详细答案:
您似乎想要详细信息来说服您。
因为每个Spring Boot项目都会对父POMspring-boot-starter-parent
defines<java.version>
进行如下扩展:
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
docs、maven.compiler.source
和maven.compiler.target
是<source>
和<target>
配置参数的user property。由于用户属性的行为,将这两个属性设置为11
意味着设置以下内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source> <!-- maven.compiler.source -->
<target>11</target> <!-- maven.compiler.target -->
</configuration>
</plugin>
在maven-compiler-plugin
docs中,<source>
和<target>
是Java编译器(javac
)的-source
和-target
参数。然后,从javac文档中,我们可以看到这两个参数被允许具有以下值:
- 1.6:Java SE 6中没有引入任何语言更改。但是,源文件中的编码错误现在报告为错误,而不是 警告与早期版本的Java Platform标准版相同。
- 6:1.6的同义词。
- 1.7:编译器接受具有Java SE 7中引入的功能的代码。
- 7:1.7的同义词。
- 1.8:编译器接受具有Java SE 8中引入的功能的代码。
- 8:1.8的同义词。
- 9:编译器接受具有Java SE 9中引入的功能的代码。
- 10:编译器接受具有Java SE 10中引入的功能的代码。
- 11:编译器接受具有Java SE 11中引入的功能的代码。
- 12:编译器接受具有Java SE 12中引入的功能的代码。
因此,对于Java 11,<java.version>
应设置为11
。
相关文章