如何在 Spring/Spring Boot pom.xml 中指定 Java 版本?
Posted
技术标签:
【中文标题】如何在 Spring/Spring Boot pom.xml 中指定 Java 版本?【英文标题】:How to specify Java version in Spring/Spring Boot pom.xml? 【发布时间】:2019-06-25 07:26:12 【问题描述】:将 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
?
我都尝试了,我的网络服务器似乎可以正确启动并正确编译(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 9 之后不再有“1.xx”。现在只有 9 点、10 点和 11 点。 你给的配置很完美。使用最新的 maven-compiler-plugin 并使用<release>11</release>
...
【参考方案1】:
简答:
正确的方法是在<java.version>
中为不同的Java版本使用以下值:
所以对于 Java 11 来说,应该是:
<properties>
<java.version>11</java.version>
</properties>
但是我不确定 Java 11 是否会是“1.11”(似乎不太可能),并且 我在使用 maven-compiler-plugin 时看到它被指定为“11”, 但是我没有使用编译器插件。
其实最后还是使用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>
来自 maven-compiler-plugin docs、maven.compiler.source
和 maven.compiler.target
是 user property 的 <source>
和 <target>
配置参数。由于用户属性的行为,将这两个属性设置为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 docs,我们可以看到这两个参数被允许具有以下值:
1.6:Java SE 6 中没有引入语言更改。但是,源文件中的编码错误现在报告为错误而不是 Java 平台标准版的早期版本中所做的警告。 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
。
【讨论】:
啊哈。很好的解释!这让一切变得更加清晰。谢谢。 如果不是大多数项目,请考虑一些项目,在大型系统中,使用 spring-boot bom 导入而不是扩展它的父级。而且 bom import 既不导入属性也不导入插件版本【参考方案2】:如果有人希望在 gradle 项目中将 Java 11 指定为 Spring(或 Spring Boot)中使用的版本,则使用 sourceCompatibility = '11' 或 sourceCompatibility = '1.11'在你的 build.gradle 文件中
plugins
id 'org.springframework.boot' version '2.1.4.RELEASE'
apply plugin: 'io.spring.dependency-management'
group = 'au.com.ranuka'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
//or
sourceCompatibility = '1.11'
repositories
mavenCentral()
dependencies
【讨论】:
由于这是 Google 搜索中的最高结果,非常感谢【参考方案3】:我将其添加为答案,以便对更多人有所帮助:
从 Java 9 开始,版本被指定为9
、10
、11
等,而不是1.8
、1.7
等。一些进一步阅读here。
您使用<release>11</release>
指定JDK 版本的方式是正确的。它是用maven-compiler-plugin 3.6
引入的,相当于旧的方式,如下:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source> -- Using JDK 11 to compile
<target>11</target> -- Using JDK 11 as target
</configuration>
</plugin>
</plugins>
This 帖子有助于在 JDK 11 中使用 maven-compiler-plugin
。
【讨论】:
【参考方案4】:您不需要在 POM 文件中提及 maven-compiler-plugin, 如果您只想指定编译器版本。 相反,将这些属性添加到您的 pom 文件中
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
编辑:我的错, 从 maven-compiler-plugin 的 3.6 版本开始,版本号属性似乎发生了变化。 上面的示例适用于 java 8 及更低版本。 对于 Java 9, 添加此属性:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
查看此问题的公认答案:Specifying java version in maven - differences between properties and compiler plugin
【讨论】:
首先这是错误的,因为不存在 JDK 版本1.11
此外,从 JDK9+ 开始,maven-compiler-plugin 通过 @987654326 支持的编译器选项 --release
@...以上是关于如何在 Spring/Spring Boot pom.xml 中指定 Java 版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何掌握 Spring,Spring Boot 全家桶?系统学习 Spring 的大纲一份(实战教学)
Spring(Spring Boot)如何向前端提供 CSRF 令牌?
如何禁用嵌入式数据库 Spring-boot spring-data-jpa
面试官:如何手写一个Spring Boot Starter?