如何在Spring/Spring Boot pom中指定Java版本.xml?

2022-08-31 15:46:23

将Java 11指定为Spring(或Spring Boot)pom.xml文件中使用的版本的正确方法是什么?

也就是说,我需要在pom的属性中放入什么值?java.version

对于 Java 8,我们使用 ,就像文档显示的那样,对于 Java 9,它是 .1.81.9

我不确定Java 11是否会是(尽管这似乎不太可能),而且我已经看到它在使用时被指定为,但是我没有使用编译器插件。1.1111maven-compiler-plugin

例如:

<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.1111

我尝试了两者,我的Web服务器似乎可以正确启动并正确编译(IntelliJ显示),但是我并不完全相信更改值会做任何事情,因为我可以将其设置为例如 一切都很好。Information:javac 11.0.2 was used to compile java sourcesjava.version100

我能找到的唯一相关问题是:与Java 11兼容的最低Spring版本,在迁移到JDK 11和带有OpenJDK 11Spring 4.3.x后,Spring Boot由于Hibernate错误而失败,但它们并没有真正揭示任何信息。


答案 1

简短的回答:

正确的方法是对不同的 Java 版本使用以下值:<java.version>

  • Java 8 : 1.8 或 8
  • 爪哇 9 : 9
  • 爪哇 10 : 10
  • 爪哇 11 : 11
  • 爪哇 12 : 12
  • .....
  • .....
  • 爪哇 16 : 16
  • 爪哇 17 : 17

所以对于Java 11,它应该是:

<properties>
   <java.version>11</java.version>
</properties>

但是我不确定Java 11是否是“1.11”(似乎不太可能),并且在使用maven-compiler-plugin时,我看到它被指定为“11”,但是我没有使用编译器插件。

实际上,在最后它仍然用于编译。Springboot 只是配置一个属性,使得通过更改此值,您可以隐式地将 's 和 更改为与中指定的值相同的值:maven-compiler-plugin<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 项目都会扩展父 pom,其定义如下:spring-boot-starter-parent<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 文档,并且是 和 config 参数的用户属性。由于用户属性的行为,将这两个属性设置为意味着设置以下内容:maven.compiler.sourcemaven.compiler.target<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>

再次从文档中,并且是 Java 编译器的和参数()。然后,从javac文档中,我们可以看到这两个参数被允许具有以下值:maven-compiler-plugin<source><target>-source-targetjavac

  • 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


答案 2

如果有人希望在 gradle 项目中指定 Java 11 作为 Spring(或 Spring Boot)中使用的版本,请在 build.gradle 文件中使用 sourceCompatibility = '11' 或 sourceCompatibility = '1.11'

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 {

}

推荐