扩展运行时隔离 —— 独立类加载 · 事务化启用 · 命名空间工具

扩展运行时隔离 —— 独立类加载 · 事务化启用 · 命名空间工具 由 Archify 生成的架构图。 扩展 JAR · META-INF/services 声明 · 架构组件 扩展 JAR META-INF/services 声明 IsolatedExtensionLoader · 每扩展一个 URLClassLoader · 架构组件 IsolatedExtensionLoader 每扩展一个 URLClassLoader ExtensionRegistry · 事务化 apply → 换入运行态 · 架构组件 ExtensionRegistry 事务化 apply → 换入运行态 失败回滚 · onStop + 关闭该类加载器 · 架构组件 失败回滚 onStop + 关闭该类加载器 SPI 契约共享 · Ai4jExtension 走父加载器 · 架构组件 SPI 契约共享 Ai4jExtension 走父加载器 DefaultExtensionContext · tools/commands/skills 暂存注册 · 架构组件 DefaultExtensionContext tools/commands/skills 暂存注册 命名空间工具 · plugin__<id>__<tool> · 架构组件 命名空间工具 plugin__<id>__<tool> disable() 释放 · 逆序 onStop + close · 架构组件 disable() 释放 逆序 onStop + close ① 逐 JAR 建加载器 ② discover + apply ③ SPI 类型父委托 ④ 失败即回滚 ⑤ 注册写暂存态 ⑥ 工具名命名空间化 ⑦ 逆序释放

隔离边界

  • • 每扩展 JAR 一个 URLClassLoader,实现类互不污染
  • • SPI 契约类型由父加载器共享,instanceof 语义一致
  • • 隔离解决依赖冲突——不是安全沙箱,不可信代码需进程边界

事务语义

  • • apply() 的注册先落暂存态,全部成功才换入运行快照
  • • 任一扩展 apply 失败:回滚已注册项 + onStop + 关闭其加载器
  • • 清理钩子抛错不掩盖原始 apply 失败原因

命名空间与生命周期

  • • 扩展工具统一 plugin__<id>__<tool>,杜绝跨插件撞名
  • • expose 仍接受裸名——解析器按后缀唯一匹配,歧义报错
  • • disable 逆序执行 onStop 并逆序关闭 classloader/资源