我现在在一个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方法的入参都是一样的)
如:第三方用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方法的入参都是一样的)
解决方案 »
- 求这个Java EE期末考试试题
- 流媒体实习视频播放
- 请问有啥办法能让导出的数据导入任何一种数据库?
- 基于J2EE和xml实现异构数据库 数据交换算法.....等高人指点
- 什么是框架?越详细越好
- 请问哪里有用struts做的小工程,我想下载研究研究,因为我自己怎么也配不通
- tomcat问题
- 请问javacc怎么装??
- 为什么我启动weblogic 8。1的examplesServer后不能read the documentation?
- 请大家进来看看,在JSP页面里有多个下拉框选项且有关连动的问题(struts结构)
- 请问Web前端和后台如何分开单独部署?
- socketchannel.read(ByteBuffer)就一直返回0,死循环,请问怎么解决?
URLClassLoader loader = new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader());
换一个URLClassLoader的构造函数,加入当前程序的类加载器,
猜想:有可能是因为URLClassLoader中new的时候发现接口A不在这个类加载器中,如果配了
parentClassLoader,即Thread.currentThread().getContextClassLoader(),就能从当前程序中查找接口类A