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 中進入通用可用(GA)階段!

原生映象為 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 profile 會觸發構建原生映象所需的基礎設施

$ ./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)處理。在該階段,會檢查應用,並評估和記錄我們通常在執行時做出的某些決策。

雖然 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 的測試,這會應用相同的過程來最佳化它並推斷必要的元資料。

您的應用不工作:現在怎麼辦?

如果您的應用無法作為原生映象工作,我們很樂意聽取您的意見,並在候選釋出版本(計劃在 10 月下旬釋出)之前改進我們的支援。支援因錯誤型別而異

  • 在前期最佳化階段構建失敗,請向 Spring Framework 問題跟蹤器報告。
  • 在生成原生映象期間構建失敗可能有多種根本原因。請使用常見的支援渠道,如 Gitter 或 StackOverflow
  • 如果應用構建成功但啟動失敗,則很可能缺少某些可達性元資料。對其的需求可能來自您自己的程式碼,或來自第三方庫。

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

後續步驟

根據社群反饋,我們將繼續改進我們的 AOT 引擎並更新參考指南,以提供有關我們引入的新 API 的更多詳細資訊。我們計劃於今年 11 月進入 GA 階段。

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

獲取 Spring 新聞通訊

訂閱 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助力您的快速提升。

瞭解更多

獲取支援

Tanzu Spring 透過一個簡單的訂閱即可為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位制檔案。

瞭解更多

即將舉行的活動

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

檢視全部