◀返回
从 Spring Boot 应用程序构建原生可执行文件
GraalVM Native Image 可以显著提升 Spring Boot 应用程序的性能。Spring Boot 3 已集成对 GraalVM Native Image 的支持,使其更容易设置和配置您的项目。
本指南演示了如何从 Spring Boot 3 应用程序构建原生可执行文件。
创建应用程序
作为演示部分,您将创建一个简单的 REST 服务器 Java 应用程序。
-
访问 Spring Initializr 并创建一个新的 Spring Boot 项目。请确保添加 GraalVM Native Support 和 Spring Web 依赖。
-
点击 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>
- 主应用程序类是由 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!"; } }
- (可选)在 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 Desktop 或 Docker。
-
首先,通过请求 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。
- Maven。打开 pom.xml 文件,找到
- 使用构建包为这个 Spring 应用程序构建原生可执行文件
- Maven
./mvnw -Pnative spring-boot:build-image
- Gradle
./gradlew bootBuildImage
- Maven
- 构建完成后,应该会有一个可用的 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 版本或早期访问版本。有关其他安装选项,请访问下载部分。
- 使用 Native Build Tools 构建原生可执行文件
- Maven
./mvnw -Pnative native:compile
该命令编译项目并在 target/ 目录中创建原生可执行文件
demo
。 - Gradle
./gradlew nativeCompile
该命令编译项目并在 build/native/nativeCompile/ 目录中创建原生可执行文件
demo
。
- Maven
- 从原生可执行文件运行应用程序
- Maven
./target/demo
- Gradle
./build/native/nativeCompile/demo
使用 Gradle,您还可以执行
nativeRun
任务:gradle nativeRun
。如果您之前在 HotSpot 上运行过此应用程序,您会注意到启动时间显著减少。
- Maven
本指南演示了如何为 Spring Boot 应用程序创建原生可执行文件。您可以在容器环境中使用 Paketo Buildpacks,或在主机上使用 Native Build Tools 来完成此操作。
Spring Boot 应用程序经过提前编译成原生可执行文件后,不仅更快、更轻,而且效率更高,特别是在资源受限的环境中,例如云平台或容器。