热加载卸载jar包
2020-12-29
1 类层次
2 源代码
hot-load-unload-jar项目
PluginClassLoader.java内容如下:
packagecom.test;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLClassLoader;importjava.net.URLConnection;importjava.util.ArrayList;importjava.util.List;
public class PluginClassLoader extendsURLClassLoader {private List cachedJarFiles = new ArrayList();publicPluginClassLoader() {super(newURL[] {}, findParentClassLoader());
}
public voidaddURLFile(URL file) {try{//打开并缓存文件url连接
URLConnection uc=file.openConnection();if (uc instanceofJarURLConnection) {
uc.setUseCaches(true);
((JarURLConnection) uc).getManifest();
cachedJarFiles.add((JarURLConnection)uc);
}
}catch(Exception e) {
System.err.println("Failed to cache plugin JAR file: " +file.toExternalForm());
}
addURL(file);
}
public voidunloadJarFiles() {for(JarURLConnection url : cachedJarFiles) {try{
System.err.println("Unloading plugin JAR file " +url.getJarFile().getName());
url.getJarFile().close();
url=null;
}catch(Exception e) {
System.err.println("Failed to unload JAR filen"+e);
}
}
}
private staticClassLoader findParentClassLoader() {
ClassLoader parent= PluginManager.class.getClassLoader();if (parent == null) {
parent= PluginClassLoader.class.getClassLoader();
}if (parent == null) {
parent=ClassLoader.getSystemClassLoader();
}returnparent;
}
}
View Code
PluginManager.java内容如下:
packagecom.test;importjava.net.MalformedURLException;importjava.net.URL;importjava.util.HashMap;importjava.util.Map;
public classPluginManager {static{
System.out.println(PluginManager.class.getName());
}private Map pluginMap = new HashMap();private static String packagename = "com.test.Plugin1";publicPluginManager(){
}public voiddoSome(String pluginName){try{
Class> forName = Class.forName(packagename, true, getLoader(pluginName));//this.pluginMap.get(pluginName).loadClass(packagename);
Plugin ins =(Plugin)forName.newInstance();
ins.doSome();
}catch(Exception e){
e.printStackTrace();
}
}private voidaddLoader(String pluginName,PluginClassLoader loader){this.pluginMap.put(pluginName, loader);
}privatePluginClassLoader getLoader(String pluginName){return this.pluginMap.get(pluginName);
}public voidloadPlugin(String pluginName){this.pluginMap.remove(pluginName);
PluginClassLoader loader= newPluginClassLoader();
String pluginurl= "jar:file:/D:/code/plugindemo/target/"+pluginName+".jar!/";
URL url= null;try{
url= newURL(pluginurl);
}catch(MalformedURLException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
loader.addURLFile(url);
addLoader(pluginName, loader);
System.out.println("load " + pluginName + " success");
}public voidunloadPlugin(String pluginName){this.pluginMap.get(pluginName).unloadJarFiles();this.pluginMap.remove(pluginName);
}
}
View Code
TestMain.java内容如下:
packagecom.test;importjava.io.BufferedReader;importjava.io.InputStreamReader;public classTestMain {public static void main(String[] args) throwsException {
PluginManager manager= newPluginManager();;
BufferedReader br= new BufferedReader(newInputStreamReader(System.in));
String cmd=br.readLine();while(!cmd.equals("bye")){if(cmd.startsWith("do")){
String pluginName= cmd.split(" ")[1];
manager.doSome(pluginName);
}if(cmd.startsWith("load")){
String pluginName= cmd.split(" ")[1];
manager.loadPlugin(pluginName);
}if(cmd.startsWith("unload")){
String pluginName= cmd.split(" ")[1];
manager.unloadPlugin(pluginName);
}
cmd=br.readLine();
}
}
}
View Code
plugin-contract项目
Plugin.java
packagecom.test;public interfacePlugin {public voiddoSome();
}
plugin-demo项目
Plugin1.java内容如下:
packagecom.test;public class Plugin1 implementsPlugin{public voiddoSome(){
System.out.println("Plugin1 doSome ... is I? YES.");
}
}
备注:
打包成 plugin-demo-1.0-SNAPSHOT.jar
Plugin1.java 内容1: System.out.println("Plugin1 doSome ... is I? YES."); 内容2:System.out.println("Plugin1 doSome ... is I? No.");
3 执行演示
参考:



