# dynamic-plugin **Repository Path**: artislong/dynamic-plugin ## Basic Information - **Project Name**: dynamic-plugin - **Description**: Dynamic Plugin 是一个灵活的动态插件加载平台,支持在运行时动态加载、卸载插件,无需重启应用。该系统适用于需要热插拔功能模块的 Java 应用,支持多种框架集成。 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-28 - **Last Updated**: 2026-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dynamic Plugin [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Maven Central](https://img.shields.io/maven-central/v/com.artislong/dynamic-plugin.svg)](https://search.maven.org/search?q=g:com.artislong%20AND%20a:dynamic-plugin) [![Java Version](https://img.shields.io/badge/Java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) Dynamic Plugin 是一个灵活的动态插件加载平台,支持在运行时动态加载、卸载插件,无需重启应用。该系统适用于需要热插拔功能模块的 Java 应用,支持多种框架集成。 ## 核心特性 - **动态加载**:支持运行时加载 JAR 包,无需重启应用 - **动态卸载**:支持运行时卸载插件,释放资源 - **多数据源**:支持从本地文件系统、OSS、SFTP 等多种数据源加载插件 - **框架集成**:支持与 Spring、MyBatis-Plus、XxlJob 等框架集成 - **集群同步**:支持集群环境下插件状态同步 - **管理平台**:提供插件管理界面,支持插件的增删改查、版本管理 ## 流程图 ![Dynamic-Plugin](https://www.processon.com/embed/68cd133e8e2d826854101196?cid=68cd133f8e2d826854101199) ## 模块说明 ### dynamic-plugin-api `dynamic-plugin-api` 是 Dynamic Plugin 的核心 API 模块,定义了插件加载、卸载和管理的接口规范。 **主要功能**: - 提供插件加载器接口 (`PluginInstanceLoader`) - 定义插件管理器接口 (`PluginInstanceManager`) - 支持插件实例的注册和卸载 **使用场景**: - 需要动态加载插件的 Java 应用 - 需要扩展插件功能的框架集成 ### dynamic-plugin-api-framework `dynamic-plugin-api-framework` 是 Dynamic Plugin 的框架集成模块,提供了与多种框架无缝集成的能力。 **主要功能**: - 支持从不同框架上下文中加载 Bean 作为插件实例 - 监听框架 Bean 的创建和销毁,自动更新插件缓存 - 提供框架专用的插件加载器 **使用场景**: - 基于 Spring、JFinal 等框架的应用需要动态加载插件 - 需要将框架 Bean 作为插件实例管理的场景 ### dynamic-plugin-core `dynamic-plugin-core` 是 Dynamic Plugin 的核心模块,提供插件加载、卸载的核心功能。 **主要功能**: - 实现插件加载、卸载的核心逻辑 - 管理插件实例的生命周期 - 提供插件状态监控 **使用场景**: - 需要动态加载插件的 Java 应用 - 需要扩展插件功能的框架集成 ### dynamic-plugin-datasource `dynamic-plugin-datasource` 是 Dynamic Plugin 的数据源模块,支持从多种数据源加载插件。 **主要功能**: - 支持从本地文件系统、OSS、SFTP 等多种数据源加载插件 - 提供数据源扩展接口 **使用场景**: - 需要从不同数据源加载插件的场景 ### dynamic-plugin-framework `dynamic-plugin-framework` 是 Dynamic Plugin 的框架集成模块,支持与多种框架集成。 **主要功能**: - 支持与 Spring、MyBatis-Plus、XxlJob 等框架集成 - 提供框架专用的插件加载器 **使用场景**: - 需要动态加载插件的 Java 应用 - 需要扩展插件功能的框架集成 ### dynamic-plugin-sample `dynamic-plugin-sample` 是 Dynamic Plugin 的示例模块,提供示例代码和演示项目。 **主要功能**: - 提供管理端示例 - 提供应用示例 - 提供插件示例 **使用场景**: - 需要参考示例代码的场景 ## 快速开始 ### 1. 添加依赖 ```xml com.artislong dynamic-plugin-core ${dynamic-plugin.version} com.artislong dynamic-plugin-framework-spring ${dynamic-plugin.version} com.artislong dynamic-plugin-datasource-sftp ${dynamic-plugin.version} ``` ### 2. 配置执行器 ```java // 创建并启动执行器 DynamicPluginExecutor executor = new DynamicPluginExecutor.Builder() .adminAddress("http://localhost:8080") .adminAccessToken("your-access-token") .executorId("executor-1") .executorPort(9999) .build(); // 注册框架处理器 executor.registerProcessor(new SpringPluginProcessor(applicationContext)); // 启动执行器 executor.start(); ``` ### 3. 创建插件 创建一个标准的 Maven 项目作为插件: ```java @Component public class HelloPlugin { @PostConstruct public void init() { System.out.println("Hello Plugin initialized!"); } public String sayHello() { return "Hello from dynamic plugin!"; } } ``` ### 4. 部署管理平台 部署 `dynamic-plugin-admin` 模块,配置数据库和存储: ```yaml dynamic: plugin: admin: access-token: your-access-token storage: type: local local: path: /path/to/plugins ``` ### 5. 上传并加载插件 通过管理平台上传插件 JAR 包,然后点击"加载"按钮将插件加载到目标执行器。 ## 模块结构 ``` dynamic-plugin ├── dynamic-plugin-admin # 管理端,提供插件管理接口 ├── dynamic-plugin-api # 插件定义,可以将接口、抽象类、普通类包装成插件,并提供插件实例的生命周期管理API ├── dynamic-plugin-api-framework # 框架集成模块 │ ├── dynamic-plugin-api-framework-java # 无开源开发框架时对插件实例的生命周期管理 │ ├── dynamic-plugin-api-framework-jfinal # Jfinal框架对插件实例的生命周期管理 │ └── dynamic-plugin-api-framework-spring # Spring框架对插件实例的生命周期管理 ├── dynamic-plugin-core # 核心模块,提供插件加载、卸载核心功能 ├── dynamic-plugin-datasource # 插件数据源模块 │ ├── dynamic-plugin-datasource-oss # OSS 数据源 │ └── dynamic-plugin-datasource-sftp # SFTP 数据源 ├── dynamic-plugin-framework # 框架集成模块 │ ├── dynamic-plugin-framework-mybatisplus # MyBatis-Plus 集成 │ ├── dynamic-plugin-framework-spring # Spring 集成 │ └── dynamic-plugin-framework-xxljob # XxlJob 集成 └── dynamic-plugin-sample # 示例项目 ├── dynamic-plugin-sample-admin # 管理端示例 ├── dynamic-plugin-sample-app # 应用示例 └── dynamic-plugin-sample-plugin # 插件示例 ``` ## 集群部署 在集群环境中,Dynamic Plugin 通过集群同步器确保多节点的插件状态一致: ``` +------------------+ +------------------+ | | | | | 管理端平台 +<---->+ 执行器节点1 | | (Admin) | | (Executor1) | | | | | +------------------+ +------------------+ | | +------------------+ | | | +---------------->+ 执行器节点2 | | | (Executor2) | | | | | +------------------+ | | +------------------+ | | | +---------------->+ 执行器节点3 | | (Executor3) | | | +------------------+ ``` ## 扩展点 ### 插件处理器扩展 通过实现 `DynamicPluginProcessor` 接口,可以扩展插件的处理逻辑: ```java public class CustomPluginProcessor implements DynamicPluginProcessor { @Override public void doLoad(DynamicPluginContext context) { // 自定义加载逻辑 } @Override public void doUnload(DynamicPluginContext context) { // 自定义卸载逻辑 } } ``` ### 插件数据源扩展 通过实现 `PluginDataSource` 抽象类,可以扩展插件的数据源: ```java public class CustomPluginDataSource extends PluginDataSource { public CustomPluginDataSource(PluginStore pluginStore, String filePath) { super(pluginStore, filePath); } @Override public InputStream getInputStream() throws Exception { // 自定义获取输入流的逻辑 } } ``` ## 贡献指南 欢迎贡献代码、报告问题或提出改进建议。请遵循以下步骤: 1. Fork 项目 2. 创建特性分支 (`git checkout -b feature/amazing-feature`) 3. 提交更改 (`git commit -m 'Add some amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 创建 Pull Request ## 许可证