在实际项目中,经常会遇到这样一种场景:
-
主 Spring Boot Jar 无法重新打包
-
希望 动态加载外部 Jar
-
外部 Jar 中包含:
- 拦截器(Interceptor)
- Filter
- 自动配置
- 业务组件
Spring Boot 官方其实早就提供了解决方案 ------ PropertiesLauncher。
一、启动命令示例
bash
java -cp runner.jar \
-Dloader.main=com.monster.core.BootApplication \
-Dloader.path=runner-other.jar \
org.springframework.boot.loader.PropertiesLauncher
二、整体启动流程
JVM
↓
加载 runner.jar
↓
PropertiesLauncher
↓
解析 loader.path
↓
加载 runner-other.jar
↓
启动 BootApplication
三、关键参数说明
1️⃣ -cp runner.jar
指定 JVM 启动时的 classpath。
- 该 Jar 必须是 Spring Boot 可执行 Jar
- 内部包含
spring-boot-loader
2️⃣ -Dloader.main
bash
-Dloader.main=com.monster.core.BootApplication
指定真正的 Spring Boot 启动类。
适用于:
- 主类不在 manifest 中
- 或需要显式指定启动入口
3️⃣ -Dloader.path
bash
-Dloader.path=runner-other.jar
这是实现 外部 Jar 扩展加载的核心参数。
支持:
- jar 文件
- 目录
- 多路径(逗号分隔)
bash
-Dloader.path=lib/,plugin.jar
4️⃣ PropertiesLauncher
bash
org.springframework.boot.loader.PropertiesLauncher
Spring Boot 提供的 可配置启动器,用于:
- 加载外部 Jar
- 构建自定义 ClassLoader
- 启动 Spring 容器
四、外部 Jar 如何被 Spring 扫描?
确保满足以下任意一种方式:
✅ 方式一:包名在扫描路径下
java
@SpringBootApplication(scanBasePackages = "com.monster")
✅ 方式二:自动配置(推荐)
properties
META-INF/spring.factories
properties
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.other.config.OtherAutoConfiguration
✅ 方式三:Spring Boot 3.x
text
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
五、典型应用场景
- 插件化系统
- Agent / 扩展包加载
- 不可重新打包的生产 Jar
- 动态拦截器 / Filter 注入
六、常见问题
❓ 外部 Jar 不生效?
排查顺序:
loader.path是否正确- Jar 是否 未压缩嵌套
- Spring 是否能扫描到包
- 是否存在 ClassLoader 冲突