Jar启动实现从指定目录中读取配置文件过程
通过将配置文件外置到指定目录,利用`--spring.config.location`参数和`@ImportResource`占位符动态加载,并修改日志路径为绝对路径,实现了启动时从外部目录读取配置,修改后仅需重启服务,无需重新打包部署。
开发需求
需求很直白:把配置文件从 jar 包内部解放出来,放到外部指定目录里,启动时从那个目录加载。这样环境切换、参数调整都不用重新打包部署,省事得多。
项目背景
原来的做法是把配置文件塞在 resources 目录下,启动时靠 @ImportResource 注解从 classpath 加载 xml 和 application.properties,结果所有东西一股脑打包进 jar。每次想改个配置,都得重新编译打包、再部署,循环往复,效率低下。
项目结构大概长这样(原图保持不变):

需要了解的源码
先搞清楚 Spring Boot 默认是怎么找到配置文件的。看一段 ConfigFileApplicationListener 里面的代码:
// 代码片段(原内容保持不变)
从这段代码能看出,Spring Boot 提供了四种配置文件路径的优先级,从低到高分别是 file:./config/ 等(具体细节可参考官方文档)。但不管哪一种,都不符合我们“从自定义目录加载”的需求。要覆盖默认的加载路径,其实只需要一行命令参数:
--spring.config.location
修改的地方
具体的调整分几步走:
1. 创建外部配置目录
在桌面上新建一个 test 目录(路径可自定义),把原来的资源文件全部挪进去。
2. 修改注解使用占位符
启动类上的 @ImportResource 注解,原先直接指向 classpath 文件,改成通过占位符动态读取:
@ImportResource(value = {"${external.file.location}"})

3. 配置占位符的值
在 application.properties 里把这个占位符指向外部目录路径:

4. 日志文件路径也改绝对路径
比如日志配置文件的位置,直接写成绝对路径:
logging.config=C:/Users/arya/Desktop/test/log4j2-dev.xml
测试jar启动
一切就绪后,重新打成 jar 包:
mvn clean package
然后在 jar 包所在目录打开命令行,执行以下命令,指定 Spring 的环境和配置路径:
ja va -jar test.jar --spring.profiles.active=dev --spring.config.location=C:/Users/arya/Desktop/test/

启动成功之后,可以看到日志和业务配置都从外部目录加载,后续修改配置只需改文件、重启服务即可,再也不需要重新打包部署了。
总结
通过将配置外置并利用 --spring.config.location 参数,我们实现了在不重新打包的情况下灵活切换配置文件的需求。这个方法很适合多环境部署或需要频繁调整参数的场景,思路清晰、操作简单,可以快速落地。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













