Java Class 转换异常,Class 使用 javax xml 提供程序时加载程序错误?

Java Class cast exception, Classloader error on using javax xml providers?

当我从 OSGI Equinox 切换到 OSGI Karaf 时出现以下错误 运行time.

早些时候 com.sun 实现工作正常,但现在我需要一个 apache 实现 运行 在一个环境中 com.sun 在旧环境中 com.sun。

我知道 OSGI 与 Java Class 加载相比有不同的 class 加载机制。

我们提供 javax 包作为 rt.jar 的一部分,其中包含 Provider 接口。

实施来自 com.sun。xml

com.sun.xml.internal.ws.spi.ProviderImpl cannot be cast to javax.xml.ws.spi.Provider (loaded by org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100162fd8) (found matching super class javax.xml.ws.spi.Provider loaded by , but needed loader org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100162fd8)
            at javax.xml.ws.spi.Provider.provider(Provider.java:43)
            at javax.xml.ws.Service.<init>(Service.java:35)
            at javax.xml.ws.Service.create(Service.java:126)

当我查看日志时,两个 class 加载程序似乎具有相同的 ID,那么为什么会出现 class 转换异常?

javax.xml.ws.spi.Provider(由org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100162fd8加载)(找到匹配超级classjavax.xml.ws.spi.Provider 由 加载,但需要加载程序 org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100162fd8)

截至目前,我正在使用 hack 在两个不同的环境中解决这个问题

private static final String PROVIDER_CXF = "org.apache.cxf.jaxws.spi.ProviderImpl";
private static final String PROVIDER_DEFAULT = "com.sun.xml.internal.ws.spi.ProviderImpl";

private String setProvider() {
    log.debug("set default provider");
    System.setProperty(PROVIDER, PROVIDER_DEFAULT);
    try {
        Service.create(new QName(null, ""));
        return PROVIDER_DEFAULT;
    } catch (Exception e) {
        log.debug("setting cxf provider");
        System.setProperty(PROVIDER, PROVIDER_CXF);
        return PROVIDER_CXF;
    }
}

您可能需要设置-Dorg.osgi.framework.bootdelegation=com.sun.*。参见 https://osgi.org/specification/osgi.core/7.0.0/framework.module.html#framework.module.parentdelegation。 Equinox 可能为启动委托提供了一个通用的、有用的默认值,而 Karaf 没有。