Исключение приведения класса Java, ошибка Classloader при использовании провайдеров javax xml? - PullRequest
0 голосов
/ 15 февраля 2019

Я получаю следующую ошибку при переключении с OSGI Equinox на OSGI Karaf.

Раньше реализация com.sun работала нормально, но теперь мне нужна реализация apache для запуска в одной среде и com.sun in the old.

Я знаю, что OSGI имеет другой механизм загрузки классов по сравнению с загрузкой классов Java.

Мы предоставляем пакеты javax как часть 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)

Когда я смотрю журналы, кажется, что оба загрузчика классов имеют одинаковый идентификатор, тогда зачем получать классисключение приведения?

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;
    }
}

1 Ответ

0 голосов
/ 15 февраля 2019

Вам может потребоваться установить -Dorg.osgi.framework.bootdelegation=com.sun.*.См. https://osgi.org/specification/osgi.core/7.0.0/framework.module.html#framework.module.parentdelegation. Возможно, Equinox предоставляет общее полезное значение по умолчанию для делегирования загрузки, а Karaf - нет.

...