構建
本節介紹如何構建 Spring Shell 應用程式。
啟動器
-
Spring Shell 啟動器
| 名稱 | 描述 |
|---|---|
spring-shell-starter |
基本 Spring Shell 模組 |
spring-shell-starter-jansi |
使用 JLine jansi 提供者 |
spring-shell-starter-jni |
使用 JLine jni 提供者 |
spring-shell-starter-jna |
使用 JLine jna 提供者 |
spring-shell-starter-ffm |
使用 JLine ffm 提供者(需要 JDK22+) |
spring-shell-starter-test |
Spring Shell 測試支援 |
終端提供者
與程式執行的底層終端互動歷來是一個相對複雜的過程,儘管看起來並沒有發生太多事情,因為一切都只是文字。
還記得那些舊式手動打字機或點陣印表機嗎?一個字元被打印出來,如果要在不同位置列印,游標需要移動。簡而言之,這就是當前終端模擬器的工作方式。
為了更好地訪問和理解現有終端模擬器環境,JLine 可以透過其自己的共享庫使用本機程式碼。JLine 檢測哪些提供者存在,然後選擇使用哪一個。傳統上,有 3 個提供者:jansi、jni 和 jna,它們都應該提供相同的功能。
我們的啟動器可以用於專門選擇其中一些 JLine 提供者。
FFM
隨著 JDK22 的釋出,外部函式和記憶體 API (Foreign Function and Memory API) 從預覽版中脫穎而出,它有望取代 JNI,提供更好、更安全的本地 API。
從 3.4.x 開始,我們增加了對使用 JLine ffm 終端提供者編譯 Spring Shell 應用程式的支援。這顯然意味著應用程式需要在 JDK22+ 上執行。每 6 個月釋出一個新的 JDK 中間版本,每 2 年釋出一個長期支援 (LTS) 版本。在 Spring Shell 能夠與 Spring Framework 對齊現有的 LTS 版本之前,我們將使用最新的 JDK 版本。顯然,這意味著如果您選擇使用 ffm,您可能需要在不方便的時候升級您的 JDK。我們還受限於 JLine 本身用於編譯其 ffm 部分的 JDK 版本。
當使用 FFM 的某些部分時,JVM 會列印警告。這些警告對於終端應用程式來說顯然很煩人,因為它可能會干擾並造成一些混亂。在未來的 JDK 版本中,這些警告也將新增到舊的 JNI 模組中,並且在某個時候,這些警告將變為硬錯誤。使用者將需要手動啟用這些本地“不安全”部分。
命令列中的 JVM 選項是
--enable-native-access=ALL-UNNAMED
如果您有一個 jar 檔案,您可以在其 META-INF/MANIFEST.MF 中進行此設定。
Enable-Native-Access: ALL-UNNAMED
這可以在構建期間新增,例如,如果使用 gradle
tasks.named("bootJar") {
manifest {
attributes 'Enable-Native-Access': 'ALL-UNNAMED'
}
}
| 至於在 JDK 中啟用原生部分,JLine 一直積極主動,並且已經對此進行了檢查,如果未啟用原生訪問,它將丟擲錯誤。 |
原生支援
將 Spring Shell 應用程式編譯為 GraalVM 二進位制檔案的支援主要來自 Spring Framework 和 Spring Boot,其中該功能稱為 AOT。提前編譯意味著在編譯時準備好應用程式上下文,以便進行 GraalVM 生成。
在框架的 AOT 功能之上,Spring Shell 擁有自己的 GraalVM 配置,提供關於二進位制檔案中應該存在哪些內容的提示。通常,問題來自尚未包含 GraalVM 相關配置或配置不完整的第三方庫。
需要使用 GraalVM Reachability Metadata Repository,它為第三方庫提供了一些缺失的提示。您還需要安裝 GraalVM,並且 JAVA_HOME 指向它。 |
對於 gradle,新增 graalvm 的原生外掛並配置元資料儲存庫。
plugins {
id 'org.graalvm.buildtools.native' version '0.9.16'
}
graalvmNative {
metadataRepository {
enabled = true
}
}
當使用 ./gradlew nativeCompile 執行 gradle 構建時,您應該會在 build/native/nativeCompile 目錄下獲得二進位制檔案。
對於 maven,使用 spring-boot-starter-parent 作為父級,您將獲得一個 native 配置檔案,可用於執行原生編譯。您需要配置元資料儲存庫
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<metadataRepository>
<enabled>true</enabled>
</metadataRepository>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
如果您依賴於 spring-boot-starter-parent,它會管理 native-maven-plugin 的版本,該版本會保持最新。 |
當使用 ./mvnw native:compile -Pnative 執行 maven 構建時,您應該會在 target 目錄下獲得二進位制檔案。
如果一切順利,可以直接執行此二進位制檔案,而無需透過 jvm 執行引導應用程式 jar。