如何在 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 并使用 &lt;release&gt;11&lt;/release&gt;... 【参考方案1】:

简答:

正确的方法是在&lt;java.version&gt;中为不同的Java版本使用以下值:

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”(似乎不太可能),并且 我在使用 maven-compiler-plugin 时看到它被指定为“11”, 但是我没有使用编译器插件。

其实最后还是使用maven-compiler-plugin编译。 Springboot 只是配置了一个 &lt;java.version&gt; 属性,这样通过更改此值,您将隐式更改 maven-compiler-plugin&lt;source/&gt;&lt;target/&gt; 到与 &lt;java.version&gt; 中指定的值相同的值:

<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&lt;java.version&gt;如下:

<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.sourcemaven.compiler.target 是 user property 的 &lt;source&gt;&lt;target&gt; 配置参数。由于用户属性的行为,将这两个属性设置为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 开始,&lt;source&gt;&lt;target&gt; 是 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,&lt;java.version&gt; 应设置为 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 开始,版本被指定为91011 等,而不是1.81.7 等。一些进一步阅读here。

您使用&lt;release&gt;11&lt;/release&gt; 指定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?

如何有选择地使一个类成为应该在 Spring (Spring Boot 2.x) 中运行的代码

Spring Boot与Spring Cloud技术选型版本对应关系