開發您的第一個 GraalVM 原生應用程式
構建 Spring Boot 本機映象應用程式主要有兩種方式
-
使用 Spring Boot 對 雲原生 Buildpacks 的支援,結合 Paketo Java Native Image buildpack 來生成一個包含本機可執行檔案的輕量級容器。
-
使用 GraalVM Native Build Tools 生成本機可執行檔案。
啟動新的 Spring Boot 本機專案最簡單的方法是訪問 start.spring.io,新增 GraalVM Native Support 依賴並生成專案。其中包含的 HELP.md 檔案將提供入門提示。 |
示例應用程式
我們需要一個示例應用程式來建立本機映象。就我們的目的而言,開發您的第一個 Spring Boot 應用程式 部分中介紹的簡單“Hello World!” Web 應用程式就足夠了。
回顧一下,我們的主要應用程式程式碼如下所示
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 守護程序中。生成的映象不包含 JVM,而是靜態編譯的本機映象。這會生成更小的映象。
用於映象的 CNB 構建器是 paketobuildpacks/builder-noble-java-tiny:latest。它佔用空間小,攻擊面小。它不包含 shell,並且包含一組精簡的系統庫。如果您需要在生成的映象中包含更多工具,可以使用 paketobuildpacks/ubuntu-noble-run:latest 作為**執行**映象。 |
| 您必須使用至少 JDK 25 來構建您的應用程式,因為 Buildpacks 使用與用於編譯的 Java 版本相同的 GraalVM native-image 版本。 |
系統要求
應該安裝 Docker。有關更多詳細資訊,請參閱 獲取 Docker。如果您使用的是 Linux,請將其配置為允許非 root 使用者。
您可以執行 docker run hello-world(不帶 sudo)來檢查 Docker 守護程序是否按預期可訪問。有關更多詳細資訊,請檢視 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>4.0.0</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 目標配置執行。 |
要構建映象,您可以在 native 配置檔案啟用的情況下執行 spring-boot:build-image 目標
$ mvn -Pnative spring-boot:build-image
使用 Gradle
當應用 GraalVM Native Image 外掛時,Spring Boot Gradle 外掛會自動配置 AOT 任務。您應該檢查您的 Gradle 構建是否包含一個 plugins 塊,其中包含 org.graalvm.buildtools.native。
只要應用了 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 應用程式快得多。 |
如果您在 Web 瀏覽器中開啟 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 25.r25-nik
$ sdk use java 25.r25-nik
透過檢查 java -version 的輸出來驗證是否已配置正確的版本
$ java -version
openjdk version "25" 2025-09-16 LTS
OpenJDK Runtime Environment Liberica-NIK-25.0.0-1 (build 25+37-LTS)
OpenJDK 64-Bit Server VM Liberica-NIK-25.0.0-1 (build 25+37-LTS, mixed mode, sharing)
Windows
在 Windows 上,請遵循這些說明,安裝版本 25 的 GraalVM 或 Liberica Native Image Kit、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 :: (v4.0.0)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
| 啟動時間因機器而異,但它應該比在 JVM 上執行的 Spring Boot 應用程式快得多。 |
如果您在 Web 瀏覽器中開啟 localhost:8080,您應該會看到以下輸出
Hello World!
要優雅地退出應用程式,請按 ctrl-c。