近期,接到一个需要动态去加载外部Jar包,动态卸载外部Jar包的任务,并且需要在卸载完成后,外部Jar包能正常修改、删除。

大体思路:

1.创建一个类,去实现URLClassLoader类,在该类中统一定义一个全局JarURLConnection,此时的加载、卸载方法,全部由统一JarURLConnection对象进行控制;

2.定义一个动态加载工具类,此类中统一定义一个第一点中提到的自定义类,全局管理,在做加载、卸载方法封装的同时,保证用到的都是唯一一个JarURLConnection继承类;

3.统一去调用封装好的加载、卸载封装类,实现外部jar包加载、接口注册、卸载等常规操作;

需要注意的是:

a.JarURLConnection类的关闭方法为

jarURLConnection.getJarFile().close();
  • 1.

如果不对其进行关闭,卸载后,将无法对外部jar包进行修改、删除操作;

b.在获取URLConnection对象后,要将其缓存打开,即

urlConnection.setUseCaches(true);
  • 1.

此处默认是false,如果不开启该缓存,外部jar包同样无法进行修改、删除操作;

c.由于开启了缓存,在卸载完外部包后,如果删除了jar包,再次去加载原来已加载的Jar,此时程序不会报错,但接口也无法正常读出,此时,需要在每次加载和卸载前使用

file.exists()
  • 1.

来实时判断外部jar包是否存在,如果返回为false,则直接终止后面操作,不然整个程序的加载、卸载管理的全局变量会乱,导致部分功能无法正常使用。