1. Ana Sayfa
  2. Java
  3. CXF kütüphanelerinin, Xerces, Xmlschema ve Xmlschema-core Kütüphaneleri ile Çakışması (MAVEN)

CXF kütüphanelerinin, Xerces, Xmlschema ve Xmlschema-core Kütüphaneleri ile Çakışması (MAVEN)

Eğer CXF kütüphaneleri ile çalışıyorsanız, diğer kütüphanelerle birçok kez çakışma yaşayabilirsiniz. Bazılarının gerçekten tespit edilmesi son derece zor oluyor. Böyle bir sorunla karşılaştığınızda birçok internette birçok sonuç bulabilirsiniz (Bir kısmının başlığı CXF kabusu).

Çalıştığım projede karşılaştığımız 2 problemi açıklamaya çalışacağım. Bunlardan birini tespit etmesi kolay diğer ise oldukça zor tespit edilebilecek bir problem. Öncelikle kolayından başlayacağım.

CXF Kütüphanelerinin Xerces ile Çakışması

Eğer Xerces kütüphanesinden java.lang.AbstractMethodError hatası alırsanız, bunun nedeni projenizin class pathinde çalıştığınız CXF kütüphanesi ile uyumlu olmayan bir Xercer kütüphanesinin varlığıdır.

Aldığınız bütün hata aşağıdaki gibi olur ;

Caused
by: java.lang.AbstractMethodError: org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler😉Ljava/lang/Object;

    at org.apache.cxf.staxutils.StaxUtils.addLocation(StaxUtils.java:1083)

    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:971)

    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:947)

    at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:874)

    at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:226)

    at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:186)

    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92)

    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:203)

    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:147)

    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:90)

 

Eski versiyonda kalmış olan bu Xerces bir kütüphane olarak eklenmiş veya başka bir kütüphane içinden geliyor olabilir. Eğer birinci durum geçerli ise çözümü oldukça kolaydır. Xerces versiyonunu yükselterek sorun giderilir.

Projemizde karşılaştığımız sorun ise ikinci maddede bahsettiğim, başka bir kütüphane içinden gelen eski bir Xerces kütüphanesiydi. Bu eski versiyonu maven dependency hiyerarşiye bakarak tespit edebiliriz. Örnek olarak; projemize eklenmiş jts 1.1.1 versiyonu kendi içinde eski olan bir Xerces kütüphanesini dahil ediyordu. Bu eski kütüphane daha yeni olan CXF Kütüphanesi ile uyumlu çalışmıyordu.

<dependency>
<groupid>com.vividsolutions</groupid>
<artifactid>jts</artifactid>
<version>1.11</version>
</dependency>

Burada yapılması gereken, jts içinde eklenmiş olan Xerces kütüphanesini çıkarmak olacaktır. Eski Xerces kütüphanesini aşağıdaki gibi çıkarabiliriz.

<dependency>
<groupid>com.vividsolutions</groupid>
<artifactid>jts</artifactid>
<version>1.11</version>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
</exclusions>
</dependency>

Sonrasında, projemizin uyumlu çalışacağı bir Xerces versiyonu açık bir şekilde eklenir.

<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.4.0</version>
</dependency>

CXF kütüphanelerinin xmlschema ve xmlschema-core Kütüphaneleri ile Çakışması

Bu ikinci problemimizi tespit etmemiz ve düzeltmemiz ilkine göre daha zor olduğunu itiraf etmeliyim. Şöyleki, aslında karşılaşılacak hata yukarıda anlattığımıza benzer bir hatadır. Ancak, kütüphane çakışmalarını tespit etmek için ne dependency hiyerarşiyi kullanabiliriz ne de projede bir referans arayabiliriz.

Burada uzun çalışmalarımız sonucu, sorunun temelinin projemize ekli bazı kütüphanelerin içinde eklenmiş kütüphanelerin versiyon bilgisini içermemesi idi.

Aldığımız hata tam olarak aşağıdaki gibidir;

java.lang.NoSuchFieldError: QUALIFIED

at org.apache.cxf.service.model.SchemaInfo.setSchema(SchemaInfo.java:146)
at org.apache.cxf.wsdl11.SchemaUtil.extractSchema(SchemaUtil.java:136)
at org.apache.cxf.wsdl11.SchemaUtil.getSchemas(SchemaUtil.java:73)
at org.apache.cxf.wsdl11.SchemaUtil.getSchemas(SchemaUtil.java:65)
at org.apache.cxf.wsdl11.SchemaUtil.getSchemas(SchemaUtil.java:60)
at org.apache.cxf.wsdl11.WSDLServiceBuilder.getSchemas(WSDLServiceBuilder.java:372)
at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:339)
at org.apache.cxf.wsdl11.WSDLServiceBuilder.buildServices(WSDLServiceBuilder.java:203)
at org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:142)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:383)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:506)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:242)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:205)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:155)
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:155)
at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:465)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:332)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:319)

Projeye eklenmiş kütüphaneleri araştırdığımızda hiçbir eski versiyonda bir kütüphanenin varlığını tespit edemedik. Son olarak, sorunun versiyonsuz eklenmiş kütüphaneler olduğunu tespit ettik. Örnek olarak, kullanılan kütüphaneler aşağıdaki gibi versiyonsuz olarak xmlscheme kütüphanelerini eklemişlerdi.

<dependency>
<groupId>org.apache.ws.xmlschema</groupId>
<artifactId>xmlschema-core</artifactId>
</dependency>

Eğer projenizde yukarıdaki gibi versiyonsuz olarak eklenmiş bir kütüphane varsa, maven kütüphane olarak depodaki ilk eşleşen versiyonu projeye ekliyor. Örnek olarak, deponuzda xmlscheme-core kütüphanesinin hem 1.4 hem de 2.3 versiyonları varsa maven ilk bulduğu versiyon olan 1.4 versiyonunu projenize ekleyecektir. Bu nedenle hata almanız kaçınılmazdır. Bunu tespit etmek de projenizde eski versiyonlarda hiçbir kullanım tespit edilemeyeceğinden oldukça zordur.

Yukarıdaki sorunu çözmek için, xmlscheme-core kullanan bütün kütüphanelerden xmlscheme-core kütüphanesini çıkardık ve daha yeni versiyonlu xmlscheme-core kütüphanesini açık olarak ekledik. Böylece doğru sınıflar classpathe eklenmiş oldu.

Sonuç olarak; karşılaştığınız kütüphane çakışmalarında versiyonsuz kütüphaneleri aklınızdan çıkarmamakta fayda var.

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

www.mshowto.org

Yorum Yap

Yazar Hakkında

Ankara Üniversitesi Bilgisayar Mühendisliği Mezunuyum. Kurumsal Java uygulamaları üzerine çalışıyorum. Genel olarak ilgilendiğim alanlar; Java, JEE, Spring, Hibernate, JSF, PrimeFaces.

Yorum Yap