JAR 插件宿主
在不修改管理端主工程源码的前提下,将符合约定的 插件 JAR 放到指定目录(或通过页面上传),由 插件宿主 在进程内加载并调用插件提供的 SPI(如启动初始化、健康检查)。管理端提供 状态、列表、安装、重载 等运维能力(需超级管理员权限)。
白话理解
可以把 插件宿主 想成:mms-admin 启动时去磁盘上「逛一圈」,按约定目录加载 JAR,在同一个 Java 进程里跑你的 SPI;需要运维时看 /system/pluginHost/* 接口或管理端插件市场。不会自动帮你把插件里的 @Controller 注册成 Spring MVC,详见下文「能力边界」。
新手从哪读起
建议顺序:① JAR 开发指南 — 第 0 节(闭环与排障) → ② 本文(配置、目录、HTTP) → ③ 再回到 JAR 开发指南 从第 1 节起写自己的插件。进阶前端配合见 JAR 插件路由协议。若后端还没跑起来,先看 项目导入与启动。
适合做什么
能做什么
| 能力 | 说明 |
|---|---|
| 按需加载 | mms.plugin.enabled=true 且配置好根目录后,应用就绪时扫描磁盘上的插件目录,按 plugin.json 校验并加载。 |
| 目录隔离 | 每个插件每个版本独立目录:lib(JAR)、data(运行数据)、tmp(临时),宿主会创建 data / tmp。 |
| HTTP 运维 | status / manifests / health 查看配置与已加载插件;install 上传单个 JAR 并触发重载;reload 全量重新扫描。 |
| 管理界面 | 超级管理员菜单进入插件市场页,查看状态与健康、上传安装(具体路径以当前 mms-ui 为准)。 |
| 前端元数据 | 已加载插件的 manifest 可包含 frontend 等字段,供前端展示协议约定见 JAR 插件路由协议。 |
能力边界
请注意
- 插件 不会 自动注册 Spring MVC 映射;
@Controller、@Autowired不会在插件 JAR 内按 Spring 方式生效。 - 热重载受类加载器与 JVM 限制;安装或升级后重启应用仍是最稳妥方式。
- 使用 Redis、数据库 等请见 JAR 开发指南 中 「与宿主 Redis、数据库」 小节。
开启与配置
在 mms-admin 的配置(如 application.yml)中设置 mms.plugin,与仓库中实际片段合并即可:
mms:
plugin:
enabled: true
root-dir: ${user.home}/mms/plugins
host-mms-revision: ${revision}| 配置项 | 含义 |
|---|---|
enabled | 是否启用宿主;为 false 时不扫描、不加载。 |
root-dir | 插件根目录;若目录不存在,宿主会在启动或扫描前 自动创建(路径为文件等异常情况除外)。具体默认值以主仓 application*.yml 为准。 |
host-mms-revision | 与根 pom 的 revision 一致,用于校验插件内 plugin.json 的 requiresMms。 |
磁盘目录约定
每个 插件 id、每个 版本 各占一层目录,其下 lib 中放置一个或多个 JAR(须至少有一个 JAR 内含 META-INF/mms/plugin.json):
<root-dir>/
<pluginId>/
<version>/
lib/
your-plugin.jar # 须含 META-INF/mms/plugin.json(或根目录 plugin.json)
extra-dependency.jar # 可选,与主插件同属一个类加载器
data/
tmp/pluginId/version目录名与plugin.json中字段对应;特殊字符会经宿主安全化,详见 JAR 开发指南。data、tmp由宿主确保存在,供插件写入运行期数据。
HTTP 接口(超级管理员)
以下接口均需 super_admin(及主工程实际鉴权方式,如 Sa-Token 请求头)。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /system/pluginHost/status | 当前配置与已加载插件列表 |
| GET | /system/pluginHost/manifests | 已加载插件 manifest(与 plugin.json 字段对齐,含 frontend 等) |
| GET | /system/pluginHost/health | 聚合各插件健康检查 SPI 的返回 |
| POST | /system/pluginHost/install | multipart/form-data,表单字段 file,单个 .jar;写入约定目录后触发全量重载 |
| POST | /system/pluginHost/reload | 卸载后重新扫描并加载(生产环境请谨慎,重大变更建议 重启应用) |
命令行调用示例(curl)
将 BASE 换成服务根地址,将鉴权头换成你环境中的 token(示例为 Bearer):
curl -sS "${BASE}/system/pluginHost/status" -H "Authorization: Bearer <token>"
curl -sS "${BASE}/system/pluginHost/health" -H "Authorization: Bearer <token>"curl -sS -X POST "${BASE}/system/pluginHost/install" \
-H "Authorization: Bearer <token>" \
-F "file=@/path/to/your-plugin.jar"
curl -sS -X POST "${BASE}/system/pluginHost/reload" \
-H "Authorization: Bearer <token>":::
示例 JAR 的构建
主仓提供示例模块 mms-plugins/mms-plugin-sample-health,在仓库根目录执行:
cd /path/to/mms
mvn -pl mms-plugins/mms-plugin-sample-health -am package -DskipTests将生成的 JAR 放入对应版本的 lib/,或在管理端使用 安装 接口/页面上传。
管理端菜单(超级管理员)
若需在菜单中出现「插件市场」等入口,可执行主仓增量 SQL(若路径已存在则跳过):
mms/script/db/increment_20260331_plugin_market_menu.sql(sys_function与角色菜单关联,通常绑定role_id='1')
契约与 SPI(查阅)
- 描述文件:
META-INF/mms/plugin.json(示例见主仓mms-plugin-api内META-INF/mms/plugin.example.json)。 - 入口 SPI:
META-INF/services/com.sxpcwlkj.plugin.MmsPlugin - 可选健康检查:
META-INF/services/com.sxpcwlkj.plugin.PluginHealthContributor
开发、打包、与宿主 Redis/库的关系等,见 JAR 开发指南。
延伸阅读
- JAR 开发指南 — 如何编写与打包插件 JAR
- JAR 插件路由协议 —
frontend与前端协作约定 - 项目简介 — 子模块速览 — 各 Maven 模块职责
