開發你的第一個 GraalVM 原生應用
構建 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 檔案將提供入門提示。 |
示例應用
我們需要一個示例應用來建立我們的原生映象。就本文而言,開發你的第一個 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 daemon 中。生成的映象不包含 JVM,而是靜態編譯的原生映象。這會生成更小的映象。
用於這些映象的 CNB builder 是 paketobuildpacks/builder-jammy-java-tiny:latest 。它佔用空間小,攻擊面小。它不包含 shell,並且只包含少量系統庫。如果需要映象中有更多工具,請使用 paketobuildpacks/builder-jammy-base:latest 或 paketobuildpacks/builder-jammy-full:latest 。 |
系統要求
應安裝 Docker。更多詳情請參閱獲取 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.4.5</version>
</parent>
此外,你的 <build> <plugins>
部分中應該有此內容
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
spring-boot-starter-parent
聲明瞭一個 native
profile,用於配置建立原生映象所需的執行步驟。你可以使用命令列上的 -P
標誌來啟用 profile。
如果你不想使用 spring-boot-starter-parent ,則需要為 Spring Boot 外掛的 process-aot goal 和 Native Build Tools 外掛的 add-reachability-metadata goal 配置執行步驟。 |
要構建映象,可以在啟用 native
profile 的情況下執行 spring-boot:build-image
goal
$ 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 應用快得多。 |
如果你在 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 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 上,請按照這些說明安裝 22.3 版本的 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
profile,並且使用了 org.graalvm.buildtools:native-maven-plugin
外掛。
啟用 native
profile 後,你可以呼叫 native:compile
goal 來觸發 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.4.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
啟動時間因機器而異,但應該比執行在 JVM 上的 Spring Boot 應用快得多。 |
如果你在 Web 瀏覽器中開啟 localhost:8080
,你應該會看到以下輸出
Hello World!
要優雅地退出應用,請按 ctrl-c
。