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 冲突
相关推荐
暮色妖娆丶7 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_7 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
Java后端的Ai之路7 小时前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
野犬寒鸦7 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
爱学英语的程序员8 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
Java新手村8 小时前
基于 Vue 3 + Spring Boot 3 的 AI 面试辅助系统:实时语音识别 + 大模型智能回答
vue.js·人工智能·spring boot
Honmaple8 小时前
OpenClaw 实战经验总结
后端
消失的旧时光-19438 小时前
第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)
spring boot·redis·缓存
golang学习记8 小时前
Go 嵌入结构体方法访问全解析:从基础到进阶陷阱
后端