返回

从 Spring Boot 应用程序构建本地可执行文件

GraalVM Native Image 可以显著提高 Spring Boot 应用程序的性能。Spring Boot 3 集成了对 GraalVM Native Image 的支持,使其更易于设置和配置项目。

本指南演示如何从 Spring Boot 3 应用程序构建本地可执行文件。

创建应用程序

在演示部分,您将创建一个简单的 REST 服务器 Java 应用程序。

  1. 转到 Spring Initializr 并创建一个新的 Spring Boot 项目。确保添加 **GraalVM 本地支持** 和 **Spring Web** 依赖项。

  2. 单击生成以创建并下载项目为 .zip 文件。解压缩文件并在您喜欢的 IDE 中打开它。

    项目配置已经包含所有必要的依赖项和插件,包括 本地构建工具。例如,如果您创建了一个 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 支持使用 Oracle 的 Paketo Buildpack 构建包含本地可执行文件的容器镜像,该镜像提供 GraalVM Native Image。

先决条件

确保您安装了 Docker-API 兼容的容器运行时,例如 Rancher DesktopDocker,并且正在运行。

  1. 首先,启用 Oracle 的 Paketo Buildpack,请求 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 时,buildpack 会下载 Oracle GraalVM,其中包括 Native Image。

  2. 使用 buildpack 为此 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 文档提供了几个示例,展示了如何使用 buildpack 使用 GraalVM Native Image 构建应用程序。

使用本地构建工具构建本地可执行文件

如果您不想使用 Docker 并在主机上创建本地可执行文件,请使用 本地构建工具,它提供 Maven 和 Gradle 插件用于构建本地镜像。

先决条件

确保您已安装 GraalVM JDK。最简单的入门方法是使用 SDKMAN!

sdk install java 21.0.4-graal

用您喜欢的 GraalVM 版本或早期访问版本替换 21.0.4。有关其他安装选项,请访问 下载部分

  1. 使用本地构建工具构建本地可执行文件
    • 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,或在主机上使用本地构建工具来执行此操作。

Spring Boot 应用程序在提前编译为本地可执行文件时,不仅速度更快、更轻巧,而且效率更高,尤其是在云平台或容器等资源受限的环境中。

与我们联系