4

我正在 websphere 7 中部署一个带有 neethi-3.0.2 的应用程序 Apache CXF-2.7.5。我遇到了以下错误。我的应用程序是弹簧驱动的。当我将 Apache CXF 降级为 apache CXF-2.3.5 时。应用程序成功部署。

同样在Tomcat7中也能完美运行。

我可以通过在 pom.xml 文件中添加(或覆盖)neethi.jar(旧版本 --> 2.5.x)的依赖项在 Tomcat 上重现此问题。

注意: Apache CXF 2.7.5 带有最新版本的 neethi.jar (3.0.2),因此不会在 Tomcat7 上引起问题。

Web sphere 是否在使用旧版本的neethi.jar

堆栈跟踪如下:

[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)

请帮忙

4

5 回答 5

5

我必须在 web 模块级别加载“parent_last”类并从 WAR 中删除以下 jar 文件:-

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

这是因为 AssertionBuilderFactory 是 2.0.5 版本的 neethi.jar 中的一个实现,但它是 3.0.2 中的一个接口,由于 CXF 2.7.5,我们正在使用它。

由于 CXF 依赖关系,这些 jar 文件是在构建时自动添加的,我认为我们必须在部署到 WAS 之前从 WAR 中手动删除这些 jar。同样对于每次部署,我们都必须更改 WAR 的类加载器设置。

要更改类加载器顺序,请使用以下路径:- Enterprise Applications > MyApplicationWAR > Manage Modules > MyApplicationWAR

编辑:

<exclusions>您可以使用标记从您的 POM 文件中执行相同的操作

<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>
于 2013-07-11T03:34:50.650 回答
2

是的,WAS 可能使用的是旧版本的 neethi。

您应该检查 websphere 的 lib 文件夹,看看那里是否有旧版本的 neethi jar。如果存在 neethi 版本冲突,您可能还需要配置容器以启用自我优先类加载方式。

另一种选择是将所需的 neethi.jar 部署到 endorsed 目录中,然后使用适当的参数启动 VM。

于 2013-07-10T10:56:00.507 回答
0

我建议您尝试设置 WAS 的类加载器属性。首先将其设置为应用程序类加载器,而不是父类加载器。这样,WAS 将获取您在应用程序中打包的 jar。高温高压

于 2013-07-10T10:51:33.143 回答
0

去掉以下三个jar对问题的解决有什么影响?我有类似的问题,但使用的是 junit 测试而不是在 WAS 中运行。我的 pom 中有 neethi-3.0.1.jar 和 cxf-rt-core-2.7.4.jar。但是我仍然在 org.apache.cxf.bus.extension.Extension 处得到 java.lang.IncompatibleClassChangeError: org.apache.neethi.AssertionBuilderFactory 所以我假设我在类路径上仍然有旧版本的 neethi。我如何解决它?geronimo-servlet_3.0_spec-1.0.jar geronimo-javamail_1.4_spec-1.7.1.jar stax-api-1.0.1.jar

于 2015-08-20T17:27:45.063 回答
-2

将最新版本的 neethi.jar 放在 Websphere 的 Java 中的背书目录中以获得快速解决方案,重新启动 JVM 并尝试一下。

于 2013-07-10T15:41:17.687 回答