Я получаю следующую ошибку при переключении с 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;
}
}