找回密码
 立即注册
首页 业界区 业界 GrralVM25打包SpringBoot成可执行文件Native-Image最佳 ...

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

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

1. 官网下载地址
2. 利用Idea便捷下载
流程是从idea左上角打开项目结构面板,点击左栏项目设置中的项目,选择JDK,点击下载JDK,选择一款GraalVM下载即可
1.png

2.png

3.png

个人追求简单优雅,不喜欢设置环境变量,利用全能的Idea动态选择JDK,因此这里就不设置环境变量了
GraalVM打包需要C++依赖,这里GraalVM官网说明支持两种方式,下载Visual studio22或最新版,没错,就是那个huge的IDE,或是使用它的buildTools下载器,只需要下载必要依赖即可
这里给出中国buildTools下载地址:https://visualstudio.microsoft.com/zh-hant/visual-cpp-build-tools/
下载后选择使用C++的桌面开发
为了保证干净简洁,只能尽可能少的安装东西,这里作者仅安装了这些就可以运行了,windowsSDK这里为了保证可运行安装了两个,理论上只需要MSVC生成工具最新版和最新版WindowsSDK两个依赖即可运行了
实际上只需要上面两把√就可以了,下面两个旧版本是为了保险的
安装之前需要注意选择安装位置
4.png

安装后无需配置环境变量,直接可用
GraalVM官网只给出了编译普通.java文件的方式,且其中的pom配置繁杂, 对于SpringBoot的farjar的编译,还需要考虑反射,AOT的各种配置,而spring的initializr给出了较为优雅的方式
可直接通过idea的spring.initializr新建项目,勾选Developer Tools下的GraalVM Native Support依赖,此处SpringBoot的版本是有要求的,具体可查询谷歌娘,但是3,4版本均是可用的
5.png


6.png

创建项目后,可以观察Spring官方的Pom文件及其简单优雅,仅比普通的配置多出了一个native-maven-plugin插件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <parent>
  6.         <groupId>org.springframework.boot</groupId>
  7.         spring-boot-starter-parent</artifactId>
  8.         <version>4.0.1</version>
  9.         <relativePath/>
  10.     </parent>
  11.     <groupId>com.tantron</groupId>
  12.     test-graalVM-demo3</artifactId>
  13.     <version>0.0.1-SNAPSHOT</version>
  14.     <name>test-graalVM-demo3</name>
  15.     <description>test-graalVM-demo3</description>
  16.     <url/>
  17.     <licenses>
  18.         <license/>
  19.     </licenses>
  20.     <developers>
  21.         <developer/>
  22.     </developers>
  23.     <scm>
  24.         <connection/>
  25.         <developerConnection/>
  26.         <tag/>
  27.         <url/>
  28.     </scm>
  29.     <properties>
  30.         <java.version>25</java.version>
  31.     </properties>
  32.     <dependencies>
  33.         <dependency>
  34.             <groupId>org.springframework.boot</groupId>
  35.             spring-boot-starter-webmvc</artifactId>
  36.         </dependency>
  37.         <dependency>
  38.             <groupId>org.springframework.boot</groupId>
  39.             spring-boot-starter-webmvc-test</artifactId>
  40.             <scope>test</scope>
  41.         </dependency>
  42.     </dependencies>
  43.     <build>
  44.         <plugins>
  45.             <plugin>
  46.                 <groupId>org.graalvm.buildtools</groupId>
  47.                 native-maven-plugin</artifactId>
  48.             </plugin>
  49.             <plugin>
  50.                 <groupId>org.springframework.boot</groupId>
  51.                 spring-boot-maven-plugin</artifactId>
  52.             </plugin>
  53.         </plugins>
  54.     </build>
  55. </project>
复制代码
Spring把大部分配置都配置在了spring-boot-starter-parent中,这里面真正配置了一个SpringBoot应用的pom.xml需要如何适配GraalVM的Native-Image打包方式
  1. <profile>
  2.   <id>native</id>
  3.   <build>
  4.     <pluginManagement>
  5.       <plugins>
  6.         <plugin>
  7.           <groupId>org.apache.maven.plugins</groupId>
  8.           maven-jar-plugin</artifactId>
  9.           <configuration>
  10.             
  11.               <manifestEntries>
  12.                 <Spring-Boot-Native-Processed>true</Spring-Boot-Native-Processed>
  13.               </manifestEntries>
  14.             </archive>
  15.           </configuration>
  16.         </plugin>
  17.         <plugin>
  18.           <groupId>org.springframework.boot</groupId>
  19.           spring-boot-maven-plugin</artifactId>
  20.           <executions>
  21.             <execution>
  22.               <id>process-aot</id>
  23.               <goals>
  24.                 <goal>process-aot</goal>
  25.               </goals>
  26.             </execution>
  27.           </executions>
  28.         </plugin>
  29.         <plugin>
  30.           <groupId>org.graalvm.buildtools</groupId>
  31.           native-maven-plugin</artifactId>
  32.           <configuration>
  33.             <classesDirectory>${project.build.outputDirectory}</classesDirectory>
  34.             <exclusions>
  35.               <exclusion>
  36.                 <groupId>org.springframework.boot</groupId>
  37.                 spring-boot-devtools</artifactId>
  38.               </exclusion>
  39.             </exclusions>
  40.           </configuration>
  41.           <executions>
  42.             <execution>
  43.               <id>add-reachability-metadata</id>
  44.               <goals>
  45.                 <goal>add-reachability-metadata</goal>
  46.               </goals>
  47.             </execution>
  48.           </executions>
  49.         </plugin>
  50.       </plugins>
  51.     </pluginManagement>
  52.   </build>
  53. </profile>
复制代码
观察配置,Spring已经把配置都处理好了,最终实际需要开发者做的事情,总结起来只有新建项目,选择配置,进行maven各项操作,在Idea傻瓜式点击就可以打包可执行文件了
由于配置的是Profile,因此需要在idea右侧maven面板或者命令行-Pnative指定native作为配置,步骤这里作者画在图中了
7.png

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


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




来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册