GrralVM25打包SpringBoot成可执行文件Native-Image最佳实践

此为作者摸索出的较为简洁的最佳实践,如有更好方法,可交流联系
首先下载GraalVM25, 两种较为优雅的方式

  1. 下载

    1. 官网下载地址
    2. 利用Idea便捷下载
    流程是从idea左上角打开项目结构面板,点击左栏项目设置中的项目,选择JDK,点击下载JDK,选择一款GraalVM下载即可
    image
    image
    image
    个人追求简单优雅,不喜欢设置环境变量,利用全能的Idea动态选择JDK,因此这里就不设置环境变量了

  2. C++依赖安装
    GraalVM打包需要C++依赖,这里GraalVM官网说明支持两种方式,下载Visual studio22或最新版,没错,就是那个huge的IDE,或是使用它的buildTools下载器,只需要下载必要依赖即可
    这里给出中国buildTools下载地址:https://visualstudio.microsoft.com/zh-hant/visual-cpp-build-tools/
    下载后选择使用C++的桌面开发
    为了保证干净简洁,只能尽可能少的安装东西,这里作者仅安装了这些就可以运行了,windowsSDK这里为了保证可运行安装了两个,理论上只需要MSVC生成工具最新版和最新版WindowsSDK两个依赖即可运行了
    实际上只需要上面两把√就可以了,下面两个旧版本是为了保险的
    安装后无需配置环境变量,直接可用
    安装之前需要注意选择安装位置
    image
  3. 快捷配置打包
    GraalVM官网只给出了编译普通.java文件的方式,且其中的pom配置繁杂, 对于SpringBoot的farjar的编译,还需要考虑反射,AOT的各种配置,而spring的initializr给出了较为优雅的方式
    可直接通过idea的spring.initializr新建项目,勾选Developer Tools下的GraalVM Native Support依赖,此处SpringBoot的版本是有要求的,具体可查询谷歌娘,但是3,4版本均是可用的
    image

    image
    创建项目后,可以观察Spring官方的Pom文件十分简单优雅,仅比普通的配置多出了一个native-maven-plugin插件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>4.0.1</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.tantron</groupId>
        <artifactId>test-graalVM-demo3</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>test-graalVM-demo3</name>
        <description>test-graalVM-demo3</description>
        <url/>
        <licenses>
            <license/>
        </licenses>
        <developers>
            <developer/>
        </developers>
        <scm>
            <connection/>
            <developerConnection/>
            <tag/>
            <url/>
        </scm>
        <properties>
            <java.version>25</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-webmvc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-webmvc-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <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>
    
    </project>

    Spring把大部分配置都配置在了spring-boot-starter-parent中,这里面真正配置了一个SpringBoot应用的pom.xml需要如何适配GraalVM的Native-Image打包方式

    <profile>
      <id>native</id>
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <configuration>
                <archive>
                  <manifestEntries>
                    <Spring-Boot-Native-Processed>true</Spring-Boot-Native-Processed>
                  </manifestEntries>
                </archive>
              </configuration>
            </plugin>
            <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <executions>
                <execution>
                  <id>process-aot</id>
                  <goals>
                    <goal>process-aot</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
            <plugin>
              <groupId>org.graalvm.buildtools</groupId>
              <artifactId>native-maven-plugin</artifactId>
              <configuration>
                <classesDirectory>${project.build.outputDirectory}</classesDirectory>
                <exclusions>
                  <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-devtools</artifactId>
                  </exclusion>
                </exclusions>
              </configuration>
              <executions>
                <execution>
                  <id>add-reachability-metadata</id>
                  <goals>
                    <goal>add-reachability-metadata</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </profile>

    观察配置,Spring已经把配置都处理好了,最终实际需要开发者做的事情,总结起来只有新建项目,选择配置,进行maven各项操作,在Idea傻瓜式点击就可以打包可执行文件了

    由于配置的是Profile,因此需要在idea右侧maven面板或者命令行-Pnative指定native作为配置,步骤这里作者画在图中了

    image

    最终出现在输出目录target目录中可以看到可执行文件,这里作者使用的是Windows,因此是exe文件,可直接双击执行

    image

 

参考文档:
spring官方initializr地址:https://start.spring.io/
GraalVM官方文档地址:https://www.graalvm.org/latest/reference-manual/native-image/


posted @ 2026-01-06 17:34  风乐  阅读(116)  评论(0)    收藏  举报