【问题标题】:Incompatible neethi.jar with WAS 7neethi.jar 与 WAS 7 不兼容
【发布时间】:2013-07-10 10:29:47
【问题描述】:

我正在部署一个带有 neethi-3.0.2 的应用程序 Apache CXF-2.7.5 websphere 7. 我得到以下错误。我的应用程序是弹簧驱动的。 当我将 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)

请帮忙

【问题讨论】:

    标签: java web-services websphere cxf websphere-7


    【解决方案1】:

    我必须在 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 中的一个实现,但由于 CXF 2.7.5 是我们正在使用的 3.0.2 中的接口。

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

    要更改类加载器顺序,请使用以下路径:- 企业应用程序 > MyApplicationWAR > 管理模块 > MyApplicationWAR

    编辑:

    您可以使用 &lt;exclusions&gt; 标签在您的 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>
    

    【讨论】:

    • 我认为您可以使用 maven 依赖项定义中的 &lt;exclusions&gt; 标记自动删除这些依赖项。这比从 war 文件中手动删除它们要容易得多。
    • 是的,你是对的。我也是这样做的。更新答案
    • @Bhuvan,您是否尝试将应用服务器本身的 JVM 配置为使用 parent-last 类加载?
    • @ChryCheng:不,以上解决了我的问题。我不再从事那个项目。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 欢迎来到stackoverflow。这并不能真正回答问题。我建议打开一个新问题,如果您认为它会有所帮助,请链接到此问题作为背景。
        • 我提交了一个新问题。
        【解决方案5】:

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

        【讨论】:

        • 这是一个糟糕的解决方案,因为它可能会对 WebSphere 运行时本身产生意想不到的副作用。正确的解决方案是将应用的类加载器策略设置为最后一个父级。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-07
        相关资源
        最近更新 更多