JDK11升级后Eclipse RCP/OSGi环境SOAP消息创建失败求助
解决JDK11下Eclipse RCP/OSGi中SAAJ MessageFactory创建失败问题
针对你遇到的JDK11升级后,Eclipse RCP/OSGi环境下使用MessageFactory.newInstance().createMessage()报错的问题,核心原因是OSGi模块化类加载器无法像普通Jar环境那样自动发现SAAJ的服务实现,以下是针对性解决方案:
规范OSGi插件依赖配置
确保saaj-impl及其传递依赖(如saaj-api、javax.xml.soap-api、activation)都以OSGi插件形式引入,并在你的插件MANIFEST.MF中显式声明依赖:Require-Bundle: com.sun.xml.messaging.saaj;bundle-version="1.5.1", javax.xml.soap.api;bundle-version="1.4.0", javax.activation;bundle-version="1.2.0"注意插件符号名要与实际引入的插件一致,比如
saaj-impl对应的OSGi插件符号名通常为com.sun.xml.messaging.saaj。显式指定SAAJ元工厂实现
OSGi环境下,META-INF/services中的服务配置可能无法被类加载器识别,因此可以在代码中直接指定元工厂实现:// 提前设置系统属性指定元工厂 System.setProperty("javax.xml.soap.SAAJMetaFactory", "com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl"); // 或者直接实例化元工厂创建MessageFactory SAAJMetaFactory metaFactory = SAAJMetaFactory.getInstance("com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl"); MessageFactory messageFactory = metaFactory.newMessageFactory(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage message = messageFactory.createMessage();调整插件类加载策略
如果显式依赖仍有问题,可以尝试在插件MANIFEST.MF中添加动态导入包,让类加载器能动态获取SAAJ相关类:DynamicImport-Package: com.sun.xml.messaging.saaj.*, javax.xml.soap.*不过动态导入属于临时方案,优先推荐显式依赖插件。
验证插件导出与状态
检查saaj-impl插件的MANIFEST.MF是否正确导出了com.sun.xml.messaging.saaj.soap等核心包;同时通过Eclipse的OSGi控制台验证插件状态:- 执行
ss com.sun.xml.messaging.saaj确认插件处于ACTIVE状态 - 执行
bundle <插件ID>查看插件的导入/导出包是否正常
- 执行
内容的提问来源于stack exchange,提问作者Ajay Lamba
相关产品推荐
相关产品推荐

