# sansi-plugin **Repository Path**: sancode/sansi-plugin ## Basic Information - **Project Name**: sansi-plugin - **Description**: java插件使用DEMO - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-11 - **Last Updated**: 2024-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java-study 利用Jarloader 打造自己的插件机制 1、修改插件加载机制 修改jarloader构建方法,实现根据插件名称加载插件 ```java private static synchronized Class loadPluginClass(Configuration config) { JarLoader jarLoader = LoadUtil.getJarLoader(config.getString("name")); try { return (Class) jarLoader .loadClass(config.getString("class")); } catch (Exception e) { throw BizException.asBizException(PluginErrorCode.RUNTIME_ERROR, e); } } ``` 2、定义插件基类 ``` public abstract class AbstractServicePlugin extends AbstractPlugin{ public abstract Map call(Map args); } ``` 3、插件调用封装 Datax 通过 AbstractContainer 封装了插件调用逻辑,我们这里将调用逻辑封装如下: ``` public static Map callService(String pluginName,String configValue, Map args) { AbstractPlugin plugin = LoadUtil.loadPlugin(pluginName,configValue); if (plugin instanceof AbstractServicePlugin) { ClassLoaderSwapper classLoaderSwapper = context.get(); JarLoader jarLoader= LoadUtil.getJarLoader(pluginName); try { classLoaderSwapper.setCurrentThreadClassLoader(jarLoader); return ((AbstractServicePlugin) plugin).call(args); }finally { classLoaderSwapper.restoreCurrentThreadClassLoader(); } } else { throw BizException.asBizException(PluginErrorCode.INSTALL_ERROR, "插件类型无效"); } } ``` 4、编写插件DEMO编写 插件使用 assembly打包机制,pom文件添加 assembly 插件 ``` maven-assembly-plugin src/main/assembly/package.xml plugins dwzip package single ``` 其中package.xml包括 plugin.json、jar、lib等资源打包,具体定义文件如下: ``` dir false src/main/resources plugin.json demotask target/ sansi-plugin-demo-1.0-SNAPSHOT.jar demotask false demotask/libs runtime ``` 编辑插件服务,实现 日志输出、返回结果等。 ``` @Slf4j public class DemoServicePugin extends AbstractServicePlugin { @Override public Map call(Map args) { Map result=new LinkedHashMap<>(); result.putAll(args); result.put("code","success"); log.error(JSON.toJSONString(args)); DemoResult demoResult=new DemoResult(); demoResult.setCode("200"); demoResult.setValue("操作成功"); result.put("data",demoResult); return result; } } ``` 插件编译