猿问

Java Class cast 异常,使用 javax xml 提供程序时的 Classloader

从 OSGI Equinox 切换到 OSGI Karaf 运行时出现以下错误。


之前 com.sun 实现工作正常,但现在我需要一个 apache 实现在一个环境中运行,而 com.sun 在旧环境中运行。


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


我们将 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)

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


javax.xml.ws.spi.Provider(由 org.apache.felix.framework.BundleWiringImpl$ 加载BundleClassLoader@0x0000000100162fd8)(找到匹配的超类 javax.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;

    }

}


慕尼黑的夜晚无繁华
浏览 113回答 1
1回答

largeQ

您可能需要设置-Dorg.osgi.framework.bootdelegation=com.sun.*.&nbsp;请参阅https://osgi.org/specification/osgi.core/7.0.0/framework.module.html#framework.module.parentdelegation。Equinox 可能为引导委派提供了一个通用的、有用的默认值,而 Karaf 没有。
随时随地看视频慕课网APP

相关分类

Java
我要回答