Question

I am deploying one application Apache CXF-2.7.5 with neethi-3.0.2 in websphere 7. I am getting below error. My Application is spring driven. When I degraded Apache CXF to apache CXF-2.3.5. Application successfully deployed.

The same is working perfectly in Tomcat7.

I am able to reproduce this issue on Tomcat by adding (or overriding) a dependency of neethi.jar (with an older version --> 2.5.x) in pom.xml file.

Note: Apache CXF 2.7.5 comes with a latest version of neethi.jar (3.0.2), hence not causing issue on Tomcat7.

Is Web sphere picking up an older version of neethi.jar

Stack Trace is below :

[7/9/13 19:46:38:577 GMT+05:30] 00000012 FfdcProvider  I com.ibm.ws.ffdc.impl.FfdcProvider logIncident FFDC1003I: FFDC Incident emitted on /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/ffdc/server1_2a7e2a7e_13.07.09_19.46.38.57558021.txt com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest() 309
[7/9/13 19:46:38:582 GMT+05:30] 00000012 webapp        E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[CXFServlet]: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cxf' defined in class path resource [META-INF/cxf/cxf.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.cxf.bus.spring.SpringBus]: Constructor threw exception; nested exception is org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl.
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
        at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1588)
        at com.ibm.ws.webcontainer.webapp.WebApp.commonInitializationFinish(WebApp.java:350)
        at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:292)
        at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:99)
        at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:167)
        at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:722)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.cxf.bus.spring.SpringBus]: Constructor threw exception; nested exception is org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl.
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990)
        ... 35 more
Caused by: org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl.
        at org.apache.cxf.bus.extension.Extension.tryClass(Extension.java:173)
        at org.apache.cxf.bus.extension.Extension.getClassObject(Extension.java:185)
        at org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAllByType(ExtensionManagerImpl.java:138)
        at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:126)
        at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:138)
        at org.apache.cxf.bus.spring.SpringBus.<init>(SpringBus.java:47)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:45)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:515)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
        ... 37 more
Caused by: java.lang.IncompatibleClassChangeError: org.apache.neethi.AssertionBuilderFactory
        at java.lang.ClassLoader.defineClassImpl(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:265)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:726)
        at com.ibm.ws.classloader.CompoundClassLoader.localFindClass(CompoundClassLoader.java:645)
        at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:468)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:609)

Please help

Was it helpful?

Solution

I had to make 'parent_last' class loading at web module level and delete following jar files from WAR:-

geronimo-servlet_3.0_spec-1.0.jar
geronimo-javamail_1.4_spec-1.7.1.jar
stax-api-1.0.1.jar

This is because of the AssertionBuilderFactory was an implementation in 2.0.5 version of neethi.jar but is an interface in 3.0.2 which we are using due to CXF 2.7.5.

Since these jar files are automatically added at build time due to CXF dependencies, I think we'll have to manually delete these jars from WAR before deployment in WAS. Also with each deployment, we'll have to change Class Loader setting for our WAR.

To change the Class Loader order, use following path:- Enterprise Applications > MyApplicationWAR > Manage Modules > MyApplicationWAR

EDIT:

You can do the same from your POM file using <exclusions> tag

<dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-bundle-jaxrs</artifactId>
            <version>${cxf.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.geronimo.specs</groupId>
                    <artifactId>geronimo-javamail_1.4_spec</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.geronimo.specs</groupId>
                    <artifactId>geronimo-servlet_3.0_spec</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

<!-- Jettison Dependency -->
        <dependency>
            <groupId>org.codehaus.jettison</groupId>
            <artifactId>jettison</artifactId>
            <version>${jettison.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>stax</groupId>
                    <artifactId>stax-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

OTHER TIPS

Yeah, it's possible that WAS is having an older version of neethi.

You should check the lib folder of websphere to see if there's old version of neethi jar there. You may also need to configure your container to enable self-first classloading way if there's neethi version conflict.

Another option is to deploy the required neethi.jar in endorsed directory and then start the VM with appropriate parameters.

I would suggest you to try setting the class loader properties of WAS. Set it to be application class loader first instead parent class loader. With this, WAS will pick up the jar that you have packaged within the application. HTH

What impact does removing the following three jars have on the solution to the problem? I have a similar problem but with a junit test rather than running in WAS. I have neethi-3.0.1.jar and cxf-rt-core-2.7.4.jar in my pom. However I still get java.lang.IncompatibleClassChangeError: org.apache.neethi.AssertionBuilderFactory at at org.apache.cxf.bus.extension.Extension so I assume I am somehow still have older version of neethi on the classpath. How do I fix it? geronimo-servlet_3.0_spec-1.0.jar geronimo-javamail_1.4_spec-1.7.1.jar stax-api-1.0.1.jar

Put the latest version neethi.jar in the endorsed directory within you Websphere's Java for a quick solution, restart your JVM's and try it out.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top