【问题标题】:Java Class cast exception, Classloader error on using javax xml providers?Java Class cast 异常,使用 javax xml 提供程序时的 Classloader 错误?
【发布时间】:2019-07-09 12:41:05
【问题描述】:

当我从 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;
    }
}

【问题讨论】:

  • 有问题的加载器是一个名称为空的加载器,在短语“由 加载,但需要……”中提到。最后的名称,在短语“但需要的加载程序”之后是相同的,因为这是需要的,而不是找到的。

标签: java jvm osgi classloader apache-felix


【解决方案1】:

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

【讨论】:

  • 出于安全考虑,我无法启动委托 com.sun
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2023-03-20
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多