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 冲突
相关推荐
江湖十年3 分钟前
Go 并发控制:sync.Pool 详解
后端·面试·go
xdl259922 分钟前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
zb2006412027 分钟前
Spring Boot 实战:轻松实现文件上传与下载功能
java·数据库·spring boot
jwn9991 小时前
Spring Boot 整合 Keycloak
java·spring boot·后端
mldlds1 小时前
SpringBoot详解
java·spring boot·后端
kang_jin1 小时前
Spring Boot 自动配置
java·spring boot·后端
yuweiade1 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
小箌2 小时前
springboot_03
spring boot·后端·状态模式
冬奇Lab2 小时前
一天一个开源项目(第54篇):Supabase - 开源的 Postgres 开发平台,Firebase 替代方案
后端·开源·资讯
中年程序员一枚3 小时前
spring-cloud-starter-openfeign现实中的运行逻辑
java·spring boot·后端