问题是这样的:
hibernate是需要解析xml的,其中3.2版本自带了dom4j-1.6.1.jar,我本机开发也是采用这个包。开发测试一切OK。
我们的应用服务器是weblogic,有些程序是需要自动启动的,就是在weblogic上启动的时候需要自动运行,这其中也用到了xml解析,我们用的是dom4j-full.jar。
问题就出在这2个包上,dom4j-full.jar里面的dom4j版本是1.0,hibernate的是1.6.1。
如果我将1.6版本的先加载,自启动程序就不能运行,整个应用没法使用。
如果我将1.0版本的先加载,程序启动了,我的hibernate程序就出错。
我进行了错误追踪发现:
dom4j-full.jar里面org\jaxen\dom4j\下有一个XPath.class;org\dom4j\下还有一个XPath.class。而
dom4j-1.6.1.jar里面org\dom4j\下有一个XPath.class。
当我将dom4j-full.jar先加载时,hibernate总是去找org\jaxen\dom4j\下的XPath.class,我就天真的将这个XPath.class删掉,然后用新版本的XPath.class代替旧版本的XPath.class然后重新打包发布,怎么都不行。什么变态的替换办法都用到了,还是不行。
java引用类是这样的,如果有相同的类(在不同的jar中),总是返回最先找到的,就导致了如上的问题。
真是没辙呀!
最后我甚至打算去下载hibernate的源码,将引用全部写完整,然后重新编译(我可没这么干过),使它能够找到正确的包。结果发现hiber网站提供的源码下载方式不是cvs的,sourceforge上提供的cvs也超时连不上。好烦,作罢。
看来只有2种出路了:
1、放弃hibernate
2、将dom4j进行升级,涉及到原来的应用改动,工程浩大、极具风险。