最近想要用java开发一个插件。
参考
IntellijIdea 非Maven项目打Jar包(散包,依赖在外面)
IDEA导入jar包
前提
插件使用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结构
-
结果:
- 问题:
1、如果需要使用很多三方工具,需要加载很多类,每个类都要使用反射来调用,很麻烦。
2、使用的第三方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管理依赖,打包方式采用上面所述,更佳。