commons-digester使用

本文详细记录了一次在将XML解析组件整合到复杂企业级应用中时遇到的类加载器相关问题,从解析成功到部署失败的原因分析,再到通过设置类加载器解决冲突的过程。分享了在理解类加载器机制的基础上,如何有效避免此类问题,确保应用在不同环境下的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间看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是一个很关键的东西,以后还是得深入了解下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值