最近想要用java开发一个插件。
参考
前提
插件使用idea开发,插件项目选择java项目,导出为jar包作为插件使用。使用处采用URLClassLoader加载器加载,反射调用。
操作指南
- 导入依赖的过程如下:


- 导jar设置过程如下:




- 导出操作


一个简单的插件
- 调用处
@Test public void test13() throws Exception {
File file = new File("E:\\javaWorkSpace\\simple-plugin\\out\\artifacts\\simple_plugin_jar\\simple-plugin.jar"); URL url = file.toURI().toURL(); URLClassLoader classLoader = new URLClassLoader(new URL[] {
url}); Class<?> gClass = classLoader.loadClass("com.simple.plugin.SimplePlugin"); gClass.getMethod("service").invoke(gClass.newInstance()); }
讯享网
- 插件
讯享网package com.simple.plugin; / * @description: * @author: zhangmy * @Version: 1.0 * @create: 2021-03-26 17:26 / public class SimplePlugin {
public SimplePlugin() {
System.out.println("SimplePlugin构造函数执行完毕!"); } public void service() {
System.out.println("SimplePlugin插件提供服务!"); } }
- 结果

开发插件时调用第三方jar
什么是第三方jar?除了jdk以外的依赖。如果不是第三方jar,可以直接import使用,比如import java.io.File等java官方提供的。
第三方jar
package com.hwp.plugin; / * @description: * @author: zhangmy * @Version: 1.0 * @create: 2021-03-26 16:47 / public class HwpPlugin {
public HwpPlugin() {
System.out.println("HwpPlugin构造函数执行完毕!"); } public void service() {
System.out.println("HwpPlugin提供了服务service!"); } }
插件中采用ClassLoader加载第三方jar
- 依赖:
可以看到,没有要使用的HwpPlugin
- 插件代码:
讯享网package com.zmy.plugin; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; / * @description: * @author: zhangmy * @Version: 1.0 * @create: 2021-03-26 16:52 / public class ZmyPlugin {
public ZmyPlugin() {
System.out.println("ZmyPlugin构造函数执行完毕!"); } private static Class hwpPlugin = null; static {
//加载第三方jar,绝对路径,需要保证第三方jar的位置 File file = new File("E:\\javaWorkSpace\\hwp-plugin\\out\\artifacts\\hwp_plugin_jar\\hwp-plugin.jar"); try {
URLClassLoader loader = new URLClassLoader(new URL[] {
file.toURI().toURL()}); hwpPlugin = loader.loadClass("com.hwp.plugin.HwpPlugin"); System.out.println("static代码块中加载HwpPlugin.class完毕!"); } catch (MalformedURLException | ClassNotFoundException e) {
e.printStackTrace(); } } public void service () throws Exception {
System.out.println("zmy-plugin先调用hwp-plugin的功能!"); hwpPlugin.getMethod("service").invoke(hwpPlugin.newInstance()); System.out.println("zmy-plugin调用hwp-plugin的功能完毕了!"); System.out.println("ZmyPlugin提供了自己的功能!"); } }
- 打包的插件jar结构
- 结果:


- 问题:
插件中采用添加依赖+import的方式使用第三方jar
- 依赖:
HwpPlugin被导入
- 插件代码:
package com.dpw.plugin; import com.hwp.plugin.HwpPlugin; / * @description: * @author: zhangmy * @Version: 1.0 * @create: 2021-03-26 17:07 / public class DpwPlugin {
public DpwPlugin() {
System.out.println("DpwPlugin构造函数执行完毕!"); } public void service() {
System.out.println("DpwPlugin调用HwpPlugin提供的功能!"); HwpPlugin hwpPlugin = new HwpPlugin(); hwpPlugin.service(); System.out.println("HwpPlugin提供功能完毕!"); System.out.println("DpwPlugin提供了自己的功能!"); } }
- 打包的插件jar结构

- 结果:

- 思考:
import是从当前jar的根开始,按照路径去寻找指定的类型的.class文件
- 好处:
不需要反射调用,开发简单
- 问题:
打出的jar包包含所有依赖,会比较大。
注意:
导出jar的设置需要选择extract to the target jar选项,不推荐另外一个。选择另外一个包结构会有所有变化,不好管理。


探索了三天,特此记录。
可以使用maven管理依赖,打包方式采用上面所述,更佳。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/74766.html