在RCP中使用第三方jar

本文介绍了解决Dom4j在Eclipse插件开发中出现的classnotfoundexception及DocumentFactorycannotbecasttoDocumentFactory错误的方法。通过正确配置Manifest.mf文件和构建路径,确保只有一个版本的Dom4j被加载。

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

最近做的一个RCP小工具里用到了解析xml,个人不是很喜欢jdk原始的xml解析器,所以选择了dom4j进行xml的解析。

调试时发现解析使用SAXReader会报"classnotfoundexception"的错。而在jdk lib的ext里我已经将dom4j.jar复制进去了,而且在单类调试时已经通过,证明代码写的和库本身都没有问题,有问题的只能是classpath了。

在网上查了很多资料,有提到将dom4j做成eclipse插件的,有导入关联项目的等等,都比较麻烦,而且不符合插件开发规范,但是大家的一致意见就是eclipse插件开发导入第三方包是很麻烦的事。最终在网上查到了一篇相对比较简单,配置相对比较合理的文章,尝试了下,虽然上面的很多步骤冗余,但是还是给了我一些启示。

步骤如下:

1、在项目中创建文件夹lib,将dom4j.jar复制进去。(其实这个根据个人爱好,我比较喜欢所有的资源都在一起)

2、修改插件配置文件"Manifest.mf",加入"Bundle-ClassPath: lib/dom4j.jar"。这个是我在网上查到的信息最重要的部分,也是eclipse没有提供引入第三方包功能的地方——没有引入包的界面选项。加入此项后,在插件项目运行时就可以找到项目目录下lib下的dom4j包了。

然后我参考了几篇其它文章,不太确定这些配置是否有用,但是还是采纳了。(原因是由于导入后我的项目还是报错,我会在后面提到)

3、在build也就是中文界面的构建中——运行时信息里添加"lib/dom4j.jar",然后在后面将lib这个文件夹添加进来。这个选项我在没有将"Bundle-ClassPath: lib/dom4j.jar"加入Manifest.mf前尝试过,但是没有找到这个。所以eclipse也是从Manifest.mf识别的。然后将源代码构建里的lib文件夹选定。

做完以上步骤后,你会发现在运行时的类路径里已经存在了"lib/dom4j.jar"。

其实这样就已经算配置成功了。运行项目,发现没有报"classnotfoundexception",但是我的项目却报了令一个错"org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory",这也就是我上面提到的那个错。查遍了各类网站也很少找到这个报错的类似信息,但是又一篇文章给了我一定启示:

Crap, the problem is this:

Caused by: org.dom4j.DocumentException: org.dom4j.DocumentFactory
cannot be
cast to org.dom4j.DocumentFactory Nested exception:

Basically, when you do a "new SomeClass()" using the standard
classloader and then "new SomeClass()" using a different one, those
are NOT the same classes.
They cannot be cast to each other.

My guess is somewhere within DOM4J they do not do a "new
DocumentFactory()" (which defaults to the current classloader, as it
should) but for some reason they already have an instance that was
created using the default system one.

Well, let me think about it more. My only other option is to use the
JavaAgent approach, but it requires custom args to be passed at
command line (like JavaRebel does).

问题就出在我用红色字体标注的地方,大家想到没?使用了不同的~

其实原因在于我为了把项目的引用类都放在一起,而把jre的ext里的dom4j.jar复制到了项目的lib里,从而导致项目里有两个dom4j.jar,由于配置模式不同,eclipse并没有识别出来问题,但是在运行时eclipse就不知道到底是怎么回事了,所以会报错。

有的时候好习惯也不一定起到好作用啊,把jre ext里的dom4j.jar删掉,然后将lib里的dom4j.jar加入项目中,问题解决了。

这点问题我研究了两个晚上加一个早晨,郁闷~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值