返回

從 Spring Boot 應用程式建置原生可執行檔

GraalVM Native Image 可以顯著提升 Spring Boot 應用程式的效能。 Spring Boot 3 已整合 GraalVM Native Image 的支援,讓設定和配置專案更加容易。

本指南示範如何從 Spring Boot 3 應用程式建置原生可執行檔。

建立應用程式

在示範部分,您將建立一個簡單的 REST 伺服器 Java 應用程式。

  1. 前往 Spring Initializr 並建立一個新的 Spring Boot 專案。請務必加入 GraalVM Native SupportSpring Web 依賴項目。

  2. 按一下 GENERATE 以建立並下載專案為 .zip 檔案。解壓縮檔案並在您慣用的 IDE 中開啟它。

    專案配置已包含所有必要的依賴項目和外掛程式,包括 Native Build Tools。 例如,如果您建立的是 Maven 專案,這些是 pom.xml 檔案中新增的必要外掛程式

     <build>
         <plugins>
             <plugin>
                 <groupId>org.graalvm.buildtools</groupId>
                 <artifactId>native-maven-plugin</artifactId>
             </plugin>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
         </plugins>
     </build>
    
  3. 主要應用程式類別是由初始化器建立的。 在相同目錄中,建立一個名為 HelloController.java 的檔案,其中包含下列內容的 REST 控制器
     package com.example.demo;
    
     import org.springframework.web.bind.annotation.GetMapping;
     import org.springframework.web.bind.annotation.RestController;
    
     @RestController
     public class HelloController {
    
         @GetMapping("/hello")
         public String hello() {
             return "Hello, GraalVM!";
         }
     }
    
  4. (選用)在 Java HotSpot 虛擬機器上封裝並執行應用程式。
    Maven
     ./mvnw spring-boot:run
    

    Gradle

     ./gradlew bootRun
    

    它會編譯應用程式、建立 JAR 檔案並執行應用程式。

    應用程式會在數百毫秒內啟動。 開啟瀏覽器並瀏覽至 localhost:8080/hello 以查看正在執行的應用程式。您應該會看到「Hello, GraalVM!」。

使用 Paketo Buildpacks 建置原生可執行檔

Spring Boot 支援使用 Paketo Buildpack for Oracle 建置包含原生可執行檔的容器映像,該建置組件提供 GraalVM Native Image。

必要條件

請確定您已安裝並執行 Docker API 相容的容器執行階段,例如 Rancher DesktopDocker

  1. 首先,啟用 Paketo Buildpack for Oracle,要求使用 Native Image 工具。

    • Maven。 開啟 pom.xml 檔案,找到 spring-boot-maven-plugin 宣告,並變更它,使其看起來像這樣
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <builder>paketobuildpacks/builder-jammy-buildpackless-tiny</builder><!--required for AArch64/M1 support -->
                    <buildpacks>
                        <buildpack>paketobuildpacks/oracle</buildpack>
                        <buildpack>paketobuildpacks/java-native-image</buildpack>
                    </buildpacks>
                </image>
            </configuration>
        </plugin>
      

      您也應該確定 pom.xml 檔案使用 spring-boot-starter-parent<parent> 區段應該是由初始化器新增的。

    • Gradle。 開啟 build.gradle 檔案,並加入下列程式碼
        bootBuildImage {
                builder = "paketobuildpacks/builder-jammy-buildpackless-tiny"
                buildpacks = ["paketobuildpacks/oracle", "paketobuildpacks/java-native-image"]
        }
      

      要求 java-native-image 時,建置組件會下載包含 Native Image 的 Oracle GraalVM。

  2. 使用建置組件建置此 Spring 應用程式的原生可執行檔
    • Maven
        ./mvnw -Pnative spring-boot:build-image
      
    • Gradle
        ./gradlew bootBuildImage
      
  3. 建置完成後,應該會有 Docker 映像可供使用。您可以使用 docker run 啟動應用程式。例如
     docker run --rm -p 8080:8080 docker.io/library/demo:0.0.1-SNAPSHOT
    

Paketo 文件提供數個範例,示範如何使用建置組件建置具有 GraalVM Native Image 的應用程式。

使用 Native Build Tools 建置原生可執行檔

如果您不想使用 Docker 並在主機上建立原生可執行檔,請使用 Native Build Tools,它會提供 Maven 和 Gradle 外掛程式來建置原生映像。

必要條件

請確定您已安裝 GraalVM JDK。最簡單的入門方式是使用 SDKMAN!

sdk install java 21.0.4-graal

21.0.4 替代為慣用的 GraalVM 版本或搶先體驗版本。如需其他安裝選項,請瀏覽下載區段

  1. 使用 Native Build Tools 建置原生可執行檔
    • Maven
        ./mvnw -Pnative native:compile
      

      此命令會編譯專案並在 target/ 目錄中建立原生可執行檔 demo

    • Gradle
        ./gradlew nativeCompile
      

      此命令會編譯專案並在 build/native/nativeCompile/ 目錄中建立原生可執行檔 demo

  2. 從原生可執行檔執行應用程式
    • Maven
        ./target/demo
      
    • Gradle
        ./build/native/nativeCompile/demo
      

      使用 Gradle,您也可以執行 nativeRun 工作:gradle nativeRun

      如果您先前在 HotSpot 上執行此應用程式,您會注意到啟動時間大幅減少。

本指南示範如何為 Spring Boot 應用程式建立原生可執行檔。您可以使用 Paketo Buildpacks 在容器環境中執行此操作,或使用 Native Build Tools 在主機上執行此操作。

預先編譯成原生可執行檔的 Spring Boot 應用程式不僅更快、更輕巧,而且效率更高,尤其是在資源受限的環境中,例如雲端平台或容器。

與我們聯繫