領先一步
VMware 提供培訓和認證,可加速您的進展。
了解更多Spring 團隊一直致力於 Spring 應用程式的原生映像檔支援。經過在 Spring Native 實驗性專案中使用 Spring Boot 2 孵化 3 年以上後,原生支援將隨著 Spring Framework 6 和 Spring Boot 3 一起全面發布!
原生映像檔為 Java 應用程式提供了幾乎即時的啟動時間和降低的記憶體消耗。最近的 Spring Boot 3.0.0-M5
版本標誌著我們首次要求更廣泛的社群對我們的原生故事提供回饋。如果您需要了解基礎知識,請參考 3 月下旬的提前編譯 (Ahead Of Time) 基礎部落格文章。您還可以學習如何為 Spring Boot 3.0 準備您的應用程式。
自 3 月以來發生了很多事情!我們改進了與更多用例和函式庫的相容性,並在此過程中修復和改進了我們的原生支援。這篇部落格文章詳細介紹了您需要了解的入門知識。
入門最簡單的方法是從 https://start.spring.io 建立一個新專案。請務必選擇 Spring Boot 3.0.0-M5(或更高版本)以及您最喜歡的建置工具。完成後,建置原生映像檔的一種方法是使用 Native Build Tools 外掛程式和本機 GraalVM 安裝。
請按照 說明安裝 GraalVM,或者如果您已安裝 SDKMan!,請調用以下命令
$ sdk install java 22.2.r17-nik
您可以通過確保 native-image
在您的路徑上來檢查事情是否按預期運作。Spring Boot 針對 Maven 和 Gradle 具有特定的整合。如果您使用 Maven,啟用 native 配置文件會觸發建置原生映像檔所需的基础架構
$ ./mvnw -Pnative package
對於 Gradle,我們的外掛程式會對 Native Build Tools 外掛程式的存在做出反應,因此我們需要套用它
plugins {
..
id 'org.graalvm.buildtools.native' version '0.9.14'
}
完成後,這會觸發建置原生映像檔所需的基础架構
$ ./gradlew nativeCompile
這會為您的本機 OS/CPU 生成一個原生二進制檔案,分別位於 target/
和 build/native/nativeCompile
中。您可以像啟動任何其他二進制檔案一樣啟動您的應用程式。例如,使用 Maven
$ target/demo
在 3.0 中,我們的建置外掛程式有一個額外的目標,可以觸發應用程式的提前處理 (ahead-of-time processing)。在該階段,應用程式會經過檢查,並且我們會評估和記錄通常在運行時做出的某些決策。
雖然 Spring Boot 提供了大量的自動配置,但在至少符合 classpath 條件之前,這些配置都是「休眠」的。在建置原生映像檔時,必須在建置映像檔之前進行此類評估,否則所有組合都將包含在其中。
我們還需要檢測 GraalVM 無法推斷的用例,例如代理、反射和序列化的使用以及資源加載。此檢測的結果形成了所謂的可達性元數據 (reachability metadata)。整個 Spring 产品组合都已更新,以檢測此類用例並自動生成相關的元數據。
我們已決定生成帶有 Javadoc 和易於瀏覽的結構的原始碼。這允許在建置時生成的程式碼經過檢查,並在必要時輕鬆地進行調試。這也意味著我們只向 native-image
提供常規編譯的 Java 作為結果。
雖然原生相容性的首選選項是每個函式庫都提供它們需要的額外可達性元數據提示,但這並非總是可行。最近,Oracle Labs 宣布了一個 第三方可達性元數據的共享儲存庫。此儲存庫開放供貢獻,以收集整個 JVM 生態系統的可達性元數據。每個條目都經過隔離測試,以針對一系列版本。
如果您最喜歡的函式庫未提供必要的元數據,請考慮向此儲存庫貢獻。Spring 團隊正在根據我們提供的第三方函式庫整合積極貢獻。
我們對原生映像檔的支援是關於根據應用程式的依賴項和配置來最佳化應用程式,並推斷對反射、代理等的需求。這可能會遺漏特定於您的應用程式的內容,例如它對自定義函式庫或框架的使用。為了幫助您解決此問題,此里程碑還提供了一種在原生映像檔中運行現有測試的簡單方法,讓您可以驗證您的應用程式及其依賴項是否按預期運作。
為了在原生環境中運行您的測試套件,我們依賴於 Native Build Tools 外掛程式的測試支援。首先,請確保 native-image
在您的路徑中可用(有關設定說明,請參見上文)。
使用 Maven,可以按如下方式調用它
$ ./mvnw -PnativeTest test
使用 Gradle,命令如下
$ ./gradlew nativeTest
對於使用 ApplicationContext 的測試,這會應用相同的最佳化過程並推斷必要的可達性元數據。
如果您的應用程式無法作為原生映像檔運作,我們很樂意聽到您的反饋,並在 10 月底安排的候選版本之前改進我們的支援。支援因錯誤而異
Spring Framework 6 提供了一個新的 API,讓您可以程式化地記錄提示。如果缺少的提示來自您自己的程式碼,請考慮實現 RuntimeHintsRegistrar
。有關具體範例,請參閱此範例應用程式。
根據社群的回饋,我們將持續改善我們的 AOT 引擎,並更新參考指南,以提供更多關於我們所引入的新 API 的詳細資訊。我們計劃於今年十一月正式 GA (正式發布)。
這對我們來說是一個令人興奮的時刻。我們再次感謝所有已經做出貢獻並回報意見的人,並且我們期待收到更多的回饋!