返回

从 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. 主应用程序类是由 Initializer 创建的。在同一目录下,在名为 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. 首先,通过请求 Native Image 工具来启用 Paketo Buildpack for Oracle

    • 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> 部分应该已经由 Initializer 添加了。

    • 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 应用程序经过提前编译成原生可执行文件后,不仅更快、更轻,而且效率更高,特别是在资源受限的环境中,例如云平台或容器。

联系我们