Spring Boot 3.0.0-M5 中的原生支援

工程 | Stéphane Nicoll | 2022 年 9 月 26 日 | ...

Spring 團隊一直致力於為 Spring 應用程式提供原生映象支援。經過在 Spring Native 實驗專案(與 Spring Boot 2 配合使用)中 3 年多的孵化,原生支援將隨 Spring Framework 6 和 Spring Boot 3 一起進入通用可用階段!

原生映象可以為 Java 應用程式提供近乎即時的啟動時間和更低的記憶體消耗。最近釋出的 Spring Boot 3.0.0-M5 版本是我們首次就原生支援徵求更廣泛的社群反饋。如果您需要了解基礎知識,請參考三月下旬釋出的 提前編譯 (Ahead Of Time) 基礎知識部落格文章。您還可以瞭解 如何為 Spring Boot 3.0 準備您的應用程式

自三月以來,已經發生了很多事情!我們提高了與更多用例和庫的相容性,並在此過程中修復和改進了我們的原生支援。這篇部落格文章詳細介紹了您開始所需瞭解的內容。

構建您的第一個原生映象

開始最簡單的方法是使用 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,啟用原生配置會觸發構建原生映象所需的必要基礎結構

$ ./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 版本中,我們的構建外掛增加了一個額外的目標,用於觸發應用程式的提前編譯處理。在此階段,應用程式將被檢查,並且一些我們通常在執行時做出的決策將被評估和記錄。

雖然 Spring Boot 提供了廣泛的自動配置,但這些配置在至少一個類路徑條件匹配之前都是“休眠”狀態。在構建原生映象時,必須在映象構建之前完成此類評估,否則所有組合都將被包含在內。

我們還需要檢測 GraalVM 無法推斷的用例,例如代理、反射和序列化使用以及資源載入。此檢測的結果形成了所謂的“可達性元資料”。整個 Spring 產品組合已更新,以檢測此類用例並自動生成相關元資料。

我們已決定生成帶有 Javadoc 和易於瀏覽的結構的原始碼。這允許在構建時生成的程式碼得到檢查,並在需要時輕鬆除錯。這也意味著最終我們只將常規編譯的 Java 提供給 native-image

可達性元資料儲存庫

雖然原生相容性的首選方案是每個庫都提供它們所需額外的可達性元資料提示,但這並非總是可能的。最近,Oracle Labs 釋出了一個 第三方可達性元資料共享儲存庫。該儲存庫對貢獻開放,旨在收集整個 JVM 生態系統的可達性元資料。每個條目都在獨立的環境中針對一系列版本進行測試。

如果您的首選庫未提供必要的元資料,請考慮為此儲存庫做出貢獻。Spring 團隊正基於我們提供的第三方庫整合積極做出貢獻。

測試支援

我們對原生映象的支援在於根據應用程式的依賴項和配置進行最佳化,並推斷出對反射、代理等的需求。這可能會遺漏應用程式特有的某些內容,例如它對自定義庫或框架的使用。為了幫助您解決這個問題,此里程碑還提供了一種簡單的方法來在原生映象中執行現有測試,從而使您能夠驗證您的應用程式及其依賴項是否按預期工作。

要在一個原生環境中執行您的測試套件,我們依賴 Native Build Tools 外掛的測試支援。首先,請確保 native-image 在您的路徑中可用(請參閱上文的設定說明)。

使用 Maven,可以按如下方式呼叫

$ ./mvnw -PnativeTest test

使用 Gradle,命令如下

$ ./gradlew nativeTest

對於使用 ApplicationContext 的測試,這會應用相同的最佳化過程並推斷出必要的可達性元資料。

您的應用程式不起作用:現在怎麼辦?

如果您的應用程式無法以原生映象形式執行,我們很樂意聽到您的反饋,並在計劃於十月下旬釋出的釋出候選版本之前改進我們的支援。支援因錯誤而異

  • 在提前編譯最佳化階段出現構建失敗,請報告給 Spring Framework 問題跟蹤器
  • 在生成原生映象期間出現的構建失敗可能有多種根本原因。請使用 Gitter 或 StackOverflow 等常規支援渠道
  • 如果應用程式成功構建但啟動失敗,則很可能是缺少某些可達性元資料。這可能源於您自己的程式碼,也可能源於第三方庫。

Spring Framework 6 附帶了一個新的 API,允許您以程式設計方式記錄提示。如果缺少提示來自您自己的程式碼,請考慮實現 RuntimeHintsRegistrar。有關具體示例,請參閱此 示例應用程式

下一步

基於社群反饋,我們將繼續改進我們的 AOT 引擎,並更新參考指南,以提供有關我們引入的新 API 的更多詳細資訊。我們計劃於今年十一月正式釋出。

這對我們來說是一個激動人心的時刻。我們再次感謝所有已經做出貢獻和提供反饋的人,並期待收到更多反饋!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有