簡體   English   中英

maven-compiler-plugin 源不能按預期工作

[英]maven-compiler-plugin source not work as expect

我的本地有 java11,我正在使用 maven-compiler-plugin 將它的源/目標設置為 1.8,在我的代碼中我正在使用Objects.requireNonNullElse(null, new Object()); 這在 java 中不受支持 8. 當我運行 mvn package 時,它可以正常工作。 我知道 maven-compiler-plugin 中的 source 參數指定了你想使用哪個 java 版本來編譯你的源代碼,我將它設置為 1.8,但是 mvn package 仍然可以成功編譯源代碼,即使我使用了一些在 java 中不支持的方法8. 這怎么會發生? 謝謝。

你可以在這里找到我的本地設置

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
$ java -version
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment 18.9 (build 11.0.12+7)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7, mixed mode)

語言級別(例如,lambdas 的存在或不存在)和標准庫之間存在差異。 你的問題是后者。

Maven(委托給 javac),將始終使用您用於編譯的任何 JDK 的標准庫,因為它怎么可能使用其他任何東西?

假設您正在嘗試以 Java 8 為目標,但您正在使用 JDK 17 進行編譯。假設您使用了 class,它存在於 Java 8 中,但在 Java 9 中被刪除了。Java 17 應該如何優雅地處理它? 它沒有 class,因為它已被刪除。 它如何對不存在的東西進行類型檢查? 它不能。

您的情況恰恰相反:您所依賴的 class 是在更新版本的 Java 中引入的,而不是您的目標,但從根本上講,問題是相同的。

Java 真的沒有辦法跟蹤在什么階段引入了哪些類和方法,除了無法表達全部可能更改的注釋(例如我已經提到的刪除案例 - 你不能添加注釋到沒有的東西'存在)。 為了能夠正確支持您所期望的那種行為,JDK 需要了解所有以前版本的所有類的所有方法的所有簽名,但它沒有。

如果這對您來說是個問題,而且我明白為什么會這樣,那么您應該使用與您實際目標版本相匹配的 JDK 版本進行編譯。

可能還有一個您可以使用的附加插件,但如果有的話我就不知道了。 IntelliJ 的檢查發現 API 不兼容,這至少證明以編程方式檢測此問題在技術上是可行的。

暫無
暫無

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

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