Spring Boot 使用 PropertiesLauncher + loader.path 实现外部 Jar 扩展启动

在实际项目中,经常会遇到这样一种场景:

  • 主 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 不生效?

排查顺序:

  1. loader.path 是否正确
  2. Jar 是否 未压缩嵌套
  3. Spring 是否能扫描到包
  4. 是否存在 ClassLoader 冲突
相关推荐
计算机毕设定制辅导-无忧学长18 分钟前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
wo_jack2 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
量化分析码农3 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
GISer_Jing4 小时前
如何学习Agent
后端·langchain
JWASX5 小时前
【Go】map 源码解析 - group
后端·golang·map·源码分析
量化分析码农6 小时前
【Python量化波动率实战 01】波动率是怎么算的:年化、滚动与区间估计一次讲清
后端
特立独行的猫A6 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵6 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
小郎君6587 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·spring cloud
追逐时光者7 小时前
一款基于 .NET 开源、免费的数据库自治诊断平台
后端·.net