![](/img/trans.png)
[英]Specify java 1.8 JDK path in Spring boot pom.xml without setting java_home to 1.8 version
[英]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 11 , Spring 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 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 docs , maven.compiler.source
和maven.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 開始,版本被指定為9
、 10
、 11
等,而不是1.8
、 1.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.