Java类强制转换异常,使用javax xml提供程序时出现Classloader错误?

问题描述 投票:1回答:1

当我从OSGI Equinox切换到OSGI Karaf运行时,我收到以下错误。

早期的com.sun实现工作正常,但现在我需要一个apache实现在一个环境中运行,而com.sun在旧版本中运行。

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

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

该实现来自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)

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

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;
    }
}
java jvm osgi classloader apache-felix
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.