【问题标题】:Conflict with Spring Framework and and Apache CXF dependencies - 'No Such Method'与 Spring Framework 和 Apache CXF 依赖项冲突 - “没有这样的方法”
【发布时间】:2017-03-20 21:30:30
【问题描述】:

我正在尝试将一些功能集成到我的软件中,这些功能需要 Apache CXF Bundle (2.7.18) 来对一组特定的 Web 服务进行 SOAP 调用。

我的 pom.xml 文件看起来像:

<dependency>
    <--This is the new dependency I am integrating into my software-->
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-bundle</artifactId>
    <version>2.7.18</version>
</dependency>

//other dependencies

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.3.RELEASE</version>
</dependency>

项目使用 Maven 构建良好,但是当我尝试将 .WAR 文件加载到 Wildfly 中时,我收到以下堆栈跟踪:

Context initialization failed: java.lang.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.<init>(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V
at org.springframework.context.expression.StandardBeanExpressionResolver.<init>(StandardBeanExpressionResolver.java:98)
at org.springframework.context.support.AbstractApplicationContext.prepareBeanFactory(AbstractApplicationContext.java:557)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:195)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)

2017-03-20 14:27:45,076 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 340) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./p6pmtjsonresponse: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./p6pmtjsonresponse: java.lang.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.<init>(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.<init>(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V
    at org.springframework.context.expression.StandardBeanExpressionResolver.<init>(StandardBeanExpressionResolver.java:98)
    at org.springframework.context.support.AbstractApplicationContext.prepareBeanFactory(AbstractApplicationContext.java:557)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:195)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)

知道是什么原因造成的吗?我想知道我是否应该排除一些传递依赖或类似的东西?如果可能的话,我也愿意使用除 CXF 之外的其他框架。

我认为冲突是由于尝试使用两个会产生冲突的框架造成的。

提前致谢!

【问题讨论】:

    标签: java spring apache web-services maven


    【解决方案1】:

    spring-web 依赖项引入了以下 Spring jar:

    spring-aop-4.3.3.RELEASE.jar
    spring-beans-4.3.3.RELEASE.jar
    spring-context-4.3.3.RELEASE.jar
    spring-core-4.3.3.RELEASE.jar
    spring-expression-4.3.3.RELEASE.jar
    spring-web-4.3.3.RELEASE.jar
    

    添加 cxf-bundle 依赖会导致以下 Spring jars:

    spring-aop-4.3.3.RELEASE.jar
    spring-asm-3.0.7.RELEASE.jar         **
    spring-beans-4.3.3.RELEASE.jar
    spring-context-4.3.3.RELEASE.jar
    spring-core-4.3.3.RELEASE.jar
    spring-expression-3.0.7.RELEASE.jar  ** Replaced 4.3.3
    spring-jms-3.0.7.RELEASE.jar         **
    spring-tx-3.0.7.RELEASE.jar          **
    spring-web-4.3.3.RELEASE.jar
    

    如您所见,CXF使用的是Spring 3.0.7,而Spring 3.0与Spring 4.3不兼容。

    您可以尝试显式添加依赖项以强制所有 Spring jar 文件到版本 4.3.3,但我怀疑这会起作用。 Spring 3 和 Spring 4 之间的内部变化太多。

    【讨论】:

    • 我将尝试手动添加依赖项以及 yaswanth 所述的解决方案,并将更新此线程。感谢您的反馈。
    【解决方案2】:

    我可以通过升级到 CXF 3.1.10 和 Spring 4.3.3 来实现这个功能,然后用我需要的单个依赖项替换 CXF-Bundle,例如:

    <dependency>
        <groupId>org.apache.wss4j</groupId>
        <artifactId>wss4j</artifactId>
        <version>2.1.8</version>
        <type>pom</type>
    </dependency>
    
    <dependency>
        <groupId>org.apache.wss4j</groupId>
        <artifactId>wss4j-ws-security-common</artifactId>
        <version>2.1.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.1.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.1.10</version>
    </dependency>
    <!-- Jetty is needed if you're are not using the CXFServlet -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>3.1.10</version>
    </dependency>
    

    【讨论】:

      【解决方案3】:

      cxf 3.x.x 相比 cxf 2.x.x 有很多类名和包名变化。在我们的项目中,spring 4.1.6.RELEASE 在 cxf 2.7.x 上运行良好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        • 2015-04-12
        • 2015-04-12
        • 1970-01-01
        • 2016-11-05
        • 2019-08-08
        • 2021-11-05
        相关资源
        最近更新 更多