commons-digester使用

前段时间看Tomcat源码,了解到了commons-digester,写过简单的demo,刚好项目中碰到了一个xml解析功能,便使用了它。
创建Digester:
private Digester createDigester() {
		Digester digester = new Digester();
		digester.addObjectCreate("Root", ByqYspPutuDesc.class);
		digester.addObjectCreate("Root/PeakInfo", PeakInfo.class);
		digester.addSetProperties("Root/PeakInfo");
		digester.addSetNext("Root/PeakInfo", "setPeakInfo");
		digester.addObjectCreate("Root/PeakInfo/XVal", XValue.class);
		digester.addSetProperties("Root/PeakInfo/XVal");
		digester.addSetNext("Root/PeakInfo/XVal", "addXvalue");
		digester.addObjectCreate("Root/CurveInfo", CurveInfo.class);
		digester.addSetProperties("Root/CurveInfo");
		digester.addSetNext("Root/CurveInfo", "setCurveInfo");
		digester.addObjectCreate("Root/CurveInfo/XVal", XValue.class);
		digester.addSetProperties("Root/CurveInfo/XVal");
		digester.addSetNext("Root/CurveInfo/XVal", "setXvalue");
		digester.addObjectCreate("Root/CurveInfo/YVal", YValue.class);
		digester.addSetProperties("Root/CurveInfo/YVal");
		digester.addSetNext("Root/CurveInfo/YVal", "setYvalue");
		return digester;
	}


然后digester.parse(xmlIn);
一下子就解析出来了,觉得相当好用,没管那么多了,结果问题来了。
本地运行OK,打包到生产环境运行时发现报错了。因为该工程最后要集成到其他工程里面运行,整个外部工程是一个专门的平台,里面集成了很多模块,结果就出问题了。按照之前的经验,估计是跟平台环境有关(jar冲突之类。。。)。无奈,找到运维人员,查看了下weblogic后台,发现报出ClassNotFoundException,问题大概定位到了。
拿到一个生产环境的工程copy,然后跟平台负责人进行沟通,发现没有jar冲突,只是commons-digester.jar被放到了一个很特别的地方(整个平台工程是一个ejb工程,几个lib目录我也不了解),而我的模块jar包放到了WEB-INF/lib目录下,所以digester在解析的时候找不到我指定的类。

这肯定是跟classloader有关了,刚提到的那个特别的地方是某个父classloader的repository,而WEB-INF/lib是webappClassloader的repository,webappClassloader的parent是前者。郁闷了半天,在想是不是要把jar的位置挪一下呢,结果凭着直觉,在eclipse中敲下digester.set... 欣喜若狂啊!冒出setClassLoader方法,果断输入
digester.setClassLoader(Thread.currentThread().getContextClassLoader());


虽然对classloader了解不深,但是问题总算是解决了,最近看tomcat、commons-logging等源码,发现classloader是一个很关键的东西,以后还是得深入了解下。

你可能感兴趣的:(ClassLoader,Digester)