Java动态加载第三方jar包中的类需要注意的事项

我现在在一个web系统项目里面定义一个接口interface A,然后将A开放给第三方实现具体的业务。 如:第三方用A开发了一个业务jar包,里面有业务类a implements A,最后 我的系统里面要使用这个jar里的业务类a。 我加载的方法是: //参数fileName是jar包的路径,processorName 是业务类的包名+类名 public static A load(String fileName, String processorName) { String filePath = fileName; A processor = null; URL url; try { url = new URL(filePath); } catch (MalformedURLException e1) { e1.printStackTrace(); log.error("文件不存在"); return null; } URLClassLoader loader = new URLClassLoader(new URL[] { url }); try { Class<?> processorClass = loader.loadClass(processorName); processor = (A)processorClass.newInstance(); } catch (Exception e) { log.error("创建业务类失败"); e.printStackTrace(); return null; } return processor; } 问题:用main方法来调用这个load方法是能加载jar包中业务类a的,但是如果在自己系统里面按照正常流程走的时候调用load方法的时候 却报错:接口类A找不到, 但是接口类A是明明定义在系统内部的,(两次调用load方法的入参都是一样的)

解决方法:

URLClassLoader loader = new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader()); 换一个URLClassLoader的构造函数,加入当前程序的类加载器, 猜想:有可能是因为URLClassLoader中new的时候发现接口A不在这个类加载器中,如果配了 parentClassLoader,即Thread.currentThread().getContextClassLoader(),就能从当前程序中查找接口类A

经验分享 程序员 微信小程序 职场和发展