使用native-image本地镜像工具编译SpringBoot环境镜像

本文详细介绍了如何在Windows环境下,通过MSVC安装VisualStudio,安装GraalVM并验证其安装,以及使用native-image工具编译SpringBoot项目并进行AOT处理,以实现跨平台的快速运行。

MSVC环境安装

要想在未安装Java以及其他开发环境的Windows平台运行SpringBoot项目,MSVC环境是必要的

下载VisualStudio(不是VSCode)

这里我已经下载完毕,如果已经下载过可以在Windows搜索栏搜索Visual Studio Installer
打开后在下面界面选择修改来选择新工具安装
在这里插入图片描述

打开会出现以下界面(没有安装VS自行搜索Visual Studio下载专业或者社区版安装时也会出现此节面)
在这里插入图片描述
选择使用C++的桌面开发 通用Windows平台开发这两个组件
在这里插入图片描述

切记:要记住你的安装位置(VC安装路径会显示在安装界面下方)

检查本地工具安装情况

上述过程安装完毕后,在Windows搜索栏中搜索Native Tools会出现以下两个命令行工具
在这里插入图片描述

这里使用X64 Native Tools Command即64位,X86是32位环境

安装GraalVM

本次安装GraalVM社区版本即可

GraalVM安装

GraalVM下载链接
GraalVM-ce-java17-windows-X64-22.3.2

注意,SpringBoot3必须使用22.3以上版本

下载完成解压到你要安装的目录(随意,路径不要带中文)
随后在系统环境变量中将JAVA_HOME值改为GraalVM安装路径(没有就创建一个JAVA_HOME)

验证安装

如果安装正确,在powershell或者cmd中输入java -version应当显示
在这里插入图片描述

测试gu工具

在cmd或者powershell输入gu --help应当有帮助提示输出
Windows上由于gu会与Windows命令Get-Unique冲突,所以如果提示找不到可以用**gu.cmd **代替gu
在这里插入图片描述

本地镜像工具安装

接下来安装native-image工具
native-image 下载:native-image-installable-svm-java17-windows-amd64-22.3.2.jar

之后打开powershell或cmd命令行工具
使用以下命令定位到刚刚下载的jar包所在目录
cd native-imagejar包下载目录

使用gu install --file native-image工具jar包名称安装(gu用不了用gu.cmd)

验证native-image工具安装

重启命令行输入native-image --help应当能输出命令帮助信息
在这里插入图片描述

添加系统环境变量

打开系统环境变量编辑
修改或添加以下路径
Path:
添加你的VC安装路径\App\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64
14.37.32822是版本号,每个人可能不一样找到你的具体目录拷贝进去
JAVA_HOME:
修改为GraalVM安装路径,如果你之前没有安装其他Java环境,需要在Path中添加%JAVA_HOME%\bin
INCLUED
创建INCLUDE系统环境变量
添加:

  • 自己的VC安装目录\App\VC\Tools\MSVC\14.37.32822\include;
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared;
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt;
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um;
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\winrt;

去你自己对应目录找,找全后一起拼接着粘贴进去,五个路径之间用;分隔开

LIB
创建LIB系统环境变量
添加:

  • 自己的VC安装目录\App\VC\Tools\MSVC\14.37.32822\lib\x64;
  • C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64;
  • C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64

和上面一样去自己对应目录找,找全后一起拼接着粘贴进去,五个路径之间用;分隔开

准备完毕

至此环境安装全部完毕,如果你需要其他的版本
可在GraalVM的GitHub页面下载:GraalVM-GitHub
之前的GraalVM和native-image均来自于此

创建示例SpringBoot项目

这里使用IDE的Spring脚手架创建
在这里插入图片描述
JDK一定要选择GraalVM

在这里插入图片描述
SpringBoot版本一定是3以上版本,依赖项选择GraalVM Native Support(必选) 和 你需要的依赖,这里我选择一个Web

项目结构

出了启动类以外简单的写一个controller模拟一个简单功能演示即可
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a65317097c44e208a239450e51d4f6a.png

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "Hello GraalVM Native";
    }
}

发送hello请求返回一句Hello GraalVM Native

使用native-image打包

使用maven执行clean 和 package打包
在target目录下生成了一个项目的jar包
在这里插入图片描述

AOT处理

由于SpringBoot底层用到了大量反射,因此直接进行提前编译时不可行的,因为反射是动态的,程序在执行过程中才会决定执行什么模块,因此对于SpringBoot项目需要做额外处理。

SpringBoot脚手架在创建项目时导入了一个springboot:process-aot模块用于提前对反射模块进行处理
在这里插入图片描述
双击执行此模块即可对其进行处理
完成后target目录会生成用于AOT的预处理文件

接下来使用maven模块中项目创建自动导入的native:build进行打包
在这里插入图片描述

这里打包会出现问题
在这里插入图片描述
这是一个Bug
所以我们使用刚刚使用VC安装的native tools进行操作
右键使用管理员身份打开x64 Native Tools Command
在这里插入图片描述
接着cd 命令定位到你的项目路径下
由于这是cmd命令行,初始在C盘符,如果你项目在D盘是cd不过去的
先执行D:切换到D盘再cd就行了
在这里插入图片描述

使用mvn -Pnative native:compile执行编译
此时又会遇到问题
在这里插入图片描述
这是因为native插件的盘符路径转换问题
再idea中找到target目录下的tem目录会发现生成的args文件,每次执行编译都会生成一个args文件,任意打开一个
在这里插入图片描述
在这里插入图片描述
发现是路径出了问题,IDEA中使用Ctrl + R 将所有\\替换为/
在这里插入图片描述
复制修改后文件的文件名
在这里插入图片描述
回到x64 Native Tools Command命令行使用native-image命令打包
执行native-image @target\tmp\native-image-4652055330304047537.args
native-image-4652055330304047537.args替换为你自己修改过的文件名称

注意@target\tmp\xxx.args是路径,因为之前已经cd到项目路径所以是target\tmp\xxx.args,如果你已经再target目录则是tmp\xxx.args,如果在其他目录你可以用绝对路径

开始打包
在这里插入图片描述

在这里插入图片描述
显示Finished generating就算成功了
在target目录下会生成一些obj之类的链接文件和一个项目名称.exe文件

你可以选择在资源管理器中打开
在这里插入图片描述
随后在资源管理器地址栏直接输入powershell打开命令行
在这里插入图片描述

使用.\exe文件名称运行(直接双击是打不开的)

在这里插入图片描述
可以看到BootAotTestApplication in 0.062 seconds (process running for 0.065)
启动运行速度非常快

测试

在地址栏目输入项目启动的服务地址,我使用默认的https://localhost:8080/hello测试

在这里插入图片描述

使用native-image打包的exe文件可在任何Windows平台设备运行,不论是否安装运行环境

Spring Boot 3.3.0与Nacos集成环境下,使用GraalVM的`native-image`编译生成原生可执行文件时,可能会遇到如下错误提示: ``` No spring.config.import property has been defined ``` 此问题通常出现在Spring Boot应用程序尝试通过原生镜像方式运行时,无法正确解析配置元数据,尤其是在与外部配置中心(如Nacos)集成时更为常见。以下是对该问题的分析与解决方案: ### 原因分析 1. **Spring Boot 3.3.0 的配置导入机制变化** Spring Boot 3.3.0 引入了更强的配置管理机制,强调使用 `spring.config.import` 属性来显式声明外部配置源,如 `spring.config.import=nacos:`。如果未正确设置该属性,Spring Boot 会抛出提示信息[^1]。 2. **GraalVM 原生镜像对反射和资源加载的限制** GraalVM Native Image编译时进行静态分析,无法动态加载某些运行时资源(如配置类、属性文件等)。这可能导致 Spring Boot 在构建原生镜像时无法识别 `spring.config.import` 的值,即使它已在 `application.properties` 或 `application.yml` 中定义。 3. **Nacos 自动配置未被正确识别** 在原生镜像构建过程中,Spring Boot 的自动配置可能未被正确触发,尤其是涉及 Nacos 客户端的初始化部分。这通常与 GraalVM 对类路径资源的处理方式有关[^1]。 --- ### 解决方案 #### 1. 显式配置 `spring.config.import` 在 `application.properties` 或 `application.yml` 中添加如下配置: ```properties spring.config.import=nacos: ``` 或者(如需指定服务地址): ```properties spring.config.import=nacos://127.0.0.1:8848 ``` 此配置明确告诉 Spring Boot 使用 Nacos 作为配置中心,避免出现未定义 `spring.config.import` 的错误。 #### 2. 添加 Native Image 配置以支持反射和资源加载 为确保 GraalVM 正确识别 Spring Boot 和 Nacos 相关类,需通过配置文件指定需要保留的类和方法。创建如下文件: - `src/main/resources/META-INF/native-image/com.example.demo/native-config.json` 内容如下: ```json { "name": "com.example.demo", "reflection": [ { "name": "com.alibaba.cloud.nacos.NacosPropertySourceBuilder", "allDeclaredConstructors": true, "allPublicConstructors": true, "allDeclaredMethods": true, "allPublicMethods": true }, { "name": "org.springframework.boot.context.config.ConfigDataLocationResolver", "allDeclaredConstructors": true } ], "resources": { "includes": [ { "pattern": "application.properties" } ] } } ``` 该配置确保 GraalVM 在构建原生镜像时保留必要的反射信息和资源文件。 #### 3. 使用 `spring-aot-maven-plugin` 提前处理配置 在 `pom.xml` 中添加以下插件配置,启用 Spring Boot 的 AOT(Ahead-of-Time)编译功能,提前处理配置导入逻辑: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.springframework.experimental</groupId> <artifactId>spring-aot-maven-plugin</artifactId> <version>0.12.2</version> <executions> <execution> <id>generate</id> <goals> <goal>generate</goal> </goals> </execution> </executions> </plugin> ``` 执行以下命令生成 AOT 文件: ```bash mvn clean install ``` #### 4. 构建原生镜像时指定配置属性 在构建原生镜像时,可以通过命令行参数显式传递配置: ```bash native-image \ -H:Name=demo-app \ -H:ConfigurationFileDirectories=/path/to/config \ -Dspring.config.import=nacos://127.0.0.1:8848 \ -cp target/demo-0.0.1-SNAPSHOT.jar ``` --- ### 总结 解决 Spring Boot 3.3.0 与 Nacos 集成下使用 `native-image` 编译时报 `No spring.config.import property has been defined` 的关键在于: - 显式配置 `spring.config.import`; - 为 GraalVM 提供反射和资源加载的配置; - 使用 Spring Boot AOT 插件提前处理配置; - 构建时通过命令行参数传递配置信息。 通过上述方法,可以有效解决原生镜像构建过程中配置加载失败的问题,确保应用程序在原生模式下正常运行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HashMap223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值