动态加载的jar包中调用xstream的fromXml返回null

demystify 2016-09-02 04:04:04
我的项目是webService项目,为了项目的可维护性,将涉及到业务报文解析的代码打包成jar包,供核心层代码动态加载。
问题是当代码执行到jar包中的xstream.fromXml方法时,返回的Object始终为null,且不会抛出任何异常。

但是,如果不打包成jar,直接将代码放置在核心层项目中,xstream.fromXml的解析没有问题。

我的尝试:
1、排除xml内容问题,排除方法:将出问题时的xml内容复制出来,在jar包所在项目中新建一个测试类,测试发现转换没有问题。
2、不太可能是“动态加载”的问题,因为jar包中将对象解析成xml的时候是没有问题的,包中的其他部分都可以被核心层正常调用。

希望各位帮助
...全文
383 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
demystify 2016-09-07
  • 打赏
  • 举报
回复
问题已解决,之前一直在怀疑是xstream的Bug,后来发现问题还是在于“动态加载”。之前我动态加载的jar包的路径是我自己指定的目录,类似于“WEB-INF\Mylibs”这样的路径,然后通过类似下面的调用:
String classPath = "com.test.MyDerivedClass";
String libPath = "WEB-INF\\MyLibs\\MyLibs.jar";
		
File file = new File(libPath);
URL url = file.toURI().toURL();
			
URLClassLoader classLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());
						
@SuppressWarnings("unchecked")
Class<? extends MyBaseClass> myClass = (Class<? extends MyBaseClass>)classLoader.loadClass(classPath);

MyBaseClass instance = myClass.newInstance();
将上述过程中的jar包放置到Tomcat WebServices的“WebContent\WEB-INF\Mylibs”下,并修改上述的libPath,就可以解决问题了。调试发现,修改前后LoadClass是调用不同的方法,修改前是java.lang.ClassLoader.loadClass,修改后是WebappClassLoader相关的一些方法。深层原因有待进一步分析。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧