栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

java 动态卸载jar包

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 动态卸载jar包

热加载卸载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 执行演示

参考:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023615.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号