Eclipse RCP调用ExtendedXMLLoadImpl加载arxml文件出现ClassCastException报错
问题根因与解决方案
根因定位
异常的核心原因是运行时实际使用的XML解析器为JDK内置的com.sun.org.apache.xerces实现,而非Sphinx要求的独立org.apache.xerces插件版本:
ExtendedErrorHandlerWrapper实现的是独立Apache Xerces包下的org.apache.xerces.xni.parser.XMLErrorHandler接口- 运行时被注入的是JDK内置的Sun Xerces实现,要求传入的是
com.sun.org.apache.xerces.internal.xni.parser.XMLErrorHandler,两者全类名不同,因此触发类转换异常。
解决方案
- 第一步:配置JAXP实现类优先级
在RCP应用的运行配置(Run Configuration)或产品配置(*.product)的VM参数中添加以下配置,强制JAXP加载插件版的Apache Xerces实现:-Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.transform.TransformerFactory=org.apache.xerces.jaxp.SAXTransformerFactoryImpl - 第二步:调整OSGi插件启动顺序
在目标平台或产品的插件启动配置中,将org.apache.xerces插件的启动级别设置为1,开启自动启动,确保其在EMF、Sphinx相关插件之前完成初始化。 - 第三步:校验依赖配置
检查你的RCP插件的MANIFEST.MF:- 确保已添加对
org.apache.xerces包的导入依赖 - 没有配置排除javax.xml系统包的导入规则
- 不要手动引入Sun内部Xerces相关类的引用
- 确保已添加对
- 第四步:Tycho构建适配(如果适用)
若使用Tycho做RCP产品构建,需要在pom.xml的tycho-surefire、tycho-p2-runtime等插件配置中同步添加上述VM参数,避免构建、测试阶段出现相同异常。
验证方法
可以在加载ARXML的代码前添加调试逻辑,确认解析器实现生效:
System.out.println(SAXParserFactory.newInstance().getClass().getName());
输出为org.apache.xerces.jaxp.SAXParserFactoryImpl即代表配置生效。
内容的提问来源于stack exchange,提问作者m100409
相关产品推荐
相关产品推荐

