我的代碼是用 Java 17 撰寫的。我想知道是否有辦法編譯到較舊的 Java 版本(8 及更高版本)。
網上很多人建議我應該使用這樣的東西:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
但是,當我這樣做時,我遇到以下問題:
Caused by: java.lang.IllegalStateException: warning: source release 17 requires target release 17
使用release與Maven的編譯器插件,而不是沒有幫助的。
我不明白的是,如果目標和源需要完全相同,那么為什么我們的事件需要兩者?
順便說一下,我正在使用 Maven 3.8.3。
uj5u.com熱心網友回復:
不能以向下兼容性編譯的情況并非總是如此。然而,正如 1.8 引入了無法與 1.8 之前的運行時兼容的 lambda 一樣,17 包含舊運行時無法理解的新功能(特別是密封類)。如果你想告訴編譯器“我不會使用這些特性,所以你可以兼容”,你可以將編譯器版本設定為舊版本。
uj5u.com熱心網友回復:
在編譯器兼容性方面,您對 JDK 的期望是錯誤的。編譯器不是向前兼容的,而是向后兼容的。因此,你的情況,設定編譯target到Java的1.8與source在Java的17將無法正常作業。
Java 17中有一些與Java 1.8不兼容的新特性,因此Java JDK 1.8不會理解它們是什么,肯定會拋出Syntax Errors。這解釋了您從 Maven Compiler 插件收到的警告。
同時,Java 17遙遙領先。雖然它會理解以前版本的 Java 中存在的所有語法,但由于缺少類,您會遇到編譯時錯誤。此類錯誤的一個示例是java.lang.NoClassDefFoundError或java.lang.ClassNotFoundException因為某些類已被棄用和洗掉。
從Java 9開始,Java 決定最多只支持三個版本。因此,如果您使用的是Java 17,那么最后一個支持將是Java 14。在這種情況下,如果您撰寫與JDK 14兼容的所有代碼并使用JDK 17編譯,它將繼續適用于兩者之間的所有版本。
這與Java 1.8及更低版本一直以來的情況類似。代碼必須與您的目標環境兼容。因此,如果您targetCompatibility是Java 1.8,那么您sourceCompatibility也應該是Java 1.8及更低版本。
一個例子:
<!-- Correct -->
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- Wrong -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/335015.html
上一篇:SpringBoot絕對路徑說明
下一篇:奇怪的行為maven測驗
