# 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
[](https://www.apache.org/licenses/LICENSE-2.0.html)
[](https://search.maven.org/search?q=g:com.artislong%20AND%20a:dynamic-plugin)
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
Dynamic Plugin 是一个灵活的动态插件加载平台,支持在运行时动态加载、卸载插件,无需重启应用。该系统适用于需要热插拔功能模块的 Java 应用,支持多种框架集成。
## 核心特性
- **动态加载**:支持运行时加载 JAR 包,无需重启应用
- **动态卸载**:支持运行时卸载插件,释放资源
- **多数据源**:支持从本地文件系统、OSS、SFTP 等多种数据源加载插件
- **框架集成**:支持与 Spring、MyBatis-Plus、XxlJob 等框架集成
- **集群同步**:支持集群环境下插件状态同步
- **管理平台**:提供插件管理界面,支持插件的增删改查、版本管理
## 流程图

## 模块说明
### 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
## 许可证