開發您的第一個 GraalVM Native 應用程式
有兩種主要方法可以建置 Spring Boot 原生映像應用程式
-
使用 Spring Boot 對 Cloud Native Buildpacks 的支援,搭配 Paketo Java Native Image buildpack 來產生包含原生可執行檔的輕量級容器。
-
使用 GraalVM Native Build Tools 來產生原生可執行檔。
開始新的原生 Spring Boot 專案最簡單的方法是前往 start.spring.io,新增 GraalVM Native Support 依賴並產生專案。隨附的 HELP.md 檔案將提供入門提示。 |
範例應用程式
我們需要一個範例應用程式,可以用來建立我們的原生映像檔。就我們的目的而言,簡單的 "Hello World!" 網路應用程式,在開發您的第一個 Spring Boot 應用程式章節中涵蓋,就已足夠。
總結來說,我們的主要應用程式程式碼如下所示
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class MyApplication {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
此應用程式使用 Spring MVC 和嵌入式 Tomcat,兩者都已測試並驗證可與 GraalVM 原生映像檔一起運作。
使用 Buildpacks 建置原生映像檔
Spring Boot 支援使用 Cloud Native Buildpacks (CNB) 整合 Maven 和 Gradle 以及 Paketo Java Native Image buildpack,來建置包含原生可執行檔的 Docker 映像檔。這表示您只需輸入單一命令,即可快速將合理的映像檔放入本地執行的 Docker daemon 中。產生的映像檔不包含 JVM,而是靜態編譯原生映像檔。這會產生更小的映像檔。
用於映像檔的 CNB builder 是 paketobuildpacks/builder-jammy-tiny:latest 。它佔用空間小且減少了攻擊面,但您也可以使用 paketobuildpacks/builder-jammy-base:latest 或 paketobuildpacks/builder-jammy-full:latest ,以便在映像檔中擁有更多可用工具(如果需要)。 |
系統需求
應安裝 Docker。請參閱 Get Docker 以取得更多詳細資訊。如果您在 Linux 上,請設定它以允許非 root 使用者。
您可以執行 docker run hello-world (不使用 sudo ) 來檢查 Docker daemon 是否如預期可連線。請查看 Maven 或 Gradle Spring Boot 外掛程式文件以取得更多詳細資訊。 |
在 macOS 上,建議將分配給 Docker 的記憶體增加到至少 8GB ,並可能增加更多 CPU。請參閱此 Stack Overflow 回答 以取得更多詳細資訊。在 Microsoft Windows 上,請務必啟用 Docker WSL 2 後端 以獲得更好的效能。 |
使用 Maven
若要使用 Maven 建置原生映像檔容器,您應確保您的 pom.xml
檔案使用 spring-boot-starter-parent
和 org.graalvm.buildtools:native-maven-plugin
。您應該有一個看起來像這樣的 <parent>
區段
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
</parent>
您還應該在 <build> <plugins>
區段中加入此內容
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
spring-boot-starter-parent
宣告一個 native
設定檔,用於組態建立原生映像檔所需執行的項目。您可以使用命令列上的 -P
旗標來啟動設定檔。
如果您不想使用 spring-boot-starter-parent ,則需要為 Spring Boot 外掛程式的 process-aot 目標和 Native Build Tools 外掛程式的 add-reachability-metadata 目標組態執行項目。 |
若要建置映像檔,您可以執行 spring-boot:build-image
目標,並啟用 native
設定檔
$ mvn -Pnative spring-boot:build-image
使用 Gradle
當套用 GraalVM Native Image 外掛程式時,Spring Boot Gradle 外掛程式會自動組態 AOT 任務。您應檢查您的 Gradle 建置是否包含一個包含 org.graalvm.buildtools.native
的 plugins
區塊。
只要套用了 org.graalvm.buildtools.native
外掛程式,bootBuildImage
任務就會產生原生映像檔,而不是 JVM 映像檔。您可以使用以下命令執行任務
$ gradle bootBuildImage
執行範例
執行適當的建置命令後,應該會有 Docker 映像檔可用。您可以使用 docker run
啟動您的應用程式
$ docker run --rm -p 8080:8080 docker.io/library/myproject:0.0.1-SNAPSHOT
您應該會看到類似以下的輸出
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v{version-spring-boot})
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
啟動時間因機器而異,但應該比在 JVM 上執行的 Spring Boot 應用程式快得多。 |
如果您在網頁瀏覽器中開啟 localhost:8080
,您應該會看到以下輸出
Hello World!
若要優雅地結束應用程式,請按下 ctrl-c
。
使用 Native Build Tools 建置原生映像檔
如果您想要直接產生原生可執行檔,而無需使用 Docker,則可以使用 GraalVM Native Build Tools。Native Build Tools 是 GraalVM 為 Maven 和 Gradle 提供的外掛程式。您可以使用它們執行各種 GraalVM 任務,包括產生原生映像檔。
先決條件
若要使用 Native Build Tools 建置原生映像檔,您的機器上需要有 GraalVM 發行版本。您可以從 Liberica Native Image Kit 頁面 手動下載,也可以使用像 SDKMAN! 這樣的下載管理器。
Linux 和 macOS
若要在 macOS 或 Linux 上安裝原生映像檔編譯器,我們建議使用 SDKMAN!。從 sdkman.io 取得 SDKMAN!,並使用以下命令安裝 Liberica GraalVM 發行版本
$ sdk install java 22.3.r17-nik
$ sdk use java 22.3.r17-nik
透過檢查 java -version
的輸出,驗證是否已組態正確的版本
$ java -version
openjdk version "17.0.5" 2022-10-18 LTS
OpenJDK Runtime Environment GraalVM 22.3.0 (build 17.0.5+8-LTS)
OpenJDK 64-Bit Server VM GraalVM 22.3.0 (build 17.0.5+8-LTS, mixed mode)
Windows
在 Windows 上,依照 這些指示 安裝 GraalVM 或 Liberica Native Image Kit 22.3 版、Visual Studio Build Tools 和 Windows SDK。由於 Windows 相關的命令列最大長度,請務必使用 x64 Native Tools Command Prompt 而不是常規 Windows 命令列來執行 Maven 或 Gradle 外掛程式。
使用 Maven
與buildpacks 支援一樣,您需要確保您正在使用 spring-boot-starter-parent
以繼承 native
設定檔,並且使用了 org.graalvm.buildtools:native-maven-plugin
外掛程式。
在 native
設定檔啟用的情況下,您可以調用 native:compile
目標以觸發 native-image
編譯
$ mvn -Pnative native:compile
原生映像檔可執行檔可以在 target
目錄中找到。
使用 Gradle
當 Native Build Tools Gradle 外掛程式套用於您的專案時,Spring Boot Gradle 外掛程式將自動觸發 Spring AOT 引擎。任務依賴會自動組態,因此您只需執行標準 nativeCompile
任務即可產生原生映像檔
$ gradle nativeCompile
原生映像檔可執行檔可以在 build/native/nativeCompile
目錄中找到。
執行範例
此時,您的應用程式應該可以運作了。您現在可以透過直接執行它來啟動應用程式
-
Maven
-
Gradle
$ target/myproject
$ build/native/nativeCompile/myproject
您應該會看到類似以下的輸出
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
啟動時間因機器而異,但應該比在 JVM 上執行的 Spring Boot 應用程式快得多。 |
如果您在網頁瀏覽器中開啟 localhost:8080
,您應該會看到以下輸出
Hello World!
若要優雅地結束應用程式,請按下 ctrl-c
。