You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:30:52