簡體   English   中英

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

[英]How to specify Java version in Spring/Spring Boot pom.xml?

將 Java 11 指定為要在 Spring(或 Spring Boot)pom.xml 文件中使用的版本的正確方法是什么?

即,我需要在 pom 的java.version屬性中輸入什么值?

對於 Java 8,我們使用1.8 ,就像文檔中顯示的那樣,對於 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 11Spring Boot fails due to a Hibernate error after migrating to JDK 11 and Spring 4.3.x with OpenJDK 11 ,但他們真的不亮 11

簡答:

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

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

所以對於 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>指定的值相同的值<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 docsmaven.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>

再次從maven-compiler-plugin 文檔中<source><target>是 Java 編譯器 ( javac ) 的-source-target參數。 然后,從javac docs 中,我們可以看到這兩個參數允許具有以下值:

  • 1.6 :Java SE 6 中沒有引入任何語言更改。但是,源文件中的編碼錯誤現在報告為錯誤,而不是像 Java Platform, Standard Edition 的早期版本那樣報告為警告。
  • 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.version>應設置為11的Java 11。

如果有人希望在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 {

}

我將其添加為答案,以便對更多人有所幫助:

從 Java 9 開始,版本被指定為91011等,而不是1.81.7等。這里有一些進一步閱讀。

您使用<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>

這篇文章對在 JDK 11 中使用maven-compiler-plugin很有幫助。

如果您只想指定編譯器版本,則不需要在 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>

查看這個問題的公認答案: 在 maven 中指定 java 版本 - 屬性和編譯器插件之間的差異

Gradle API 為JavaVersion提供enum 我們可以使用這些常量來定義sourceCompatibility

例如。 sourceCompatibility = JavaVersion.VERSION_11

下面是幾個常量

VERSION_1_8 - Java8
VERSION_1_9 - Java9
VERSION_1_10- Java10
VERSION_11 - Java11
VERSION_12 - Java12
VERSION_13 - Java13

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM