近期,接到一个需要动态去加载外部Jar包,动态卸载外部Jar包的任务,并且需要在卸载完成后,外部Jar包能正常修改、删除。
大体思路:
1.创建一个类,去实现URLClassLoader类,在该类中统一定义一个全局JarURLConnection,此时的加载、卸载方法,全部由统一JarURLConnection对象进行控制;
2.定义一个动态加载工具类,此类中统一定义一个第一点中提到的自定义类,全局管理,在做加载、卸载方法封装的同时,保证用到的都是唯一一个JarURLConnection继承类;
3.统一去调用封装好的加载、卸载封装类,实现外部jar包加载、接口注册、卸载等常规操作;
需要注意的是:
a.JarURLConnection类的关闭方法为
如果不对其进行关闭,卸载后,将无法对外部jar包进行修改、删除操作;
b.在获取URLConnection对象后,要将其缓存打开,即
此处默认是false,如果不开启该缓存,外部jar包同样无法进行修改、删除操作;
c.由于开启了缓存,在卸载完外部包后,如果删除了jar包,再次去加载原来已加载的Jar,此时程序不会报错,但接口也无法正常读出,此时,需要在每次加载和卸载前使用
来实时判断外部jar包是否存在,如果返回为false,则直接终止后面操作,不然整个程序的加载、卸载管理的全局变量会乱,导致部分功能无法正常使用。