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 冲突
相关推荐
小码哥_常8 小时前
Spring Boot:别再重复造轮子,这些内置功能香麻了
后端
皮皮林5519 小时前
OpenFeign 首次调用卡 3 秒?八年老开发扒透 5 个坑,实战优化到 100ms!
后端
callJJ10 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
海兰10 小时前
【第27篇】Micrometer + Zipkin
人工智能·spring boot·alibaba·spring ai
千寻girling10 小时前
《 Git 详细教程 》
前端·后端·面试
海兰11 小时前
【第28篇】可观测性实战:LangFuse 方案详解
人工智能·spring boot·alibaba·spring ai
0xDevNull11 小时前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
GetcharZp12 小时前
告别 Nginx 手动配置!这款 Go 语言开发的云原生网关,才是容器化时代的真香神器!
后端
RuoyiOffice12 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
xmjd msup12 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring