spring - TOMEE + Spring + JAX-RS (NoSuchMethodError) jar 冲突

标签 spring tomcat jax-rs resteasy apache-tomee

我正在尝试在 TomEE 服务器上运行我的应用程序,在经历了很多麻烦之后我能够运行该应用程序。

但是由于某种原因,我遇到了一些关于 resteasy 的 jar 冲突,因此每当从应用程序调用 resteasy 资源类时,就会出现如下错误

Jun 05, 2015 5:57:34 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [resteasy-servlet] in context with path [/MyApplicationName] threw exception [Servlet execution threw an exception] with root cause
java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/core/MultivaluedMap;
    at org.jboss.resteasy.core.ServerResponseWriter.setDefaultContentType(ServerResponseWriter.java:186)
    at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:46)
    at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:427)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:376)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:744)

我验证了 BuiltResponse 类,它扩展了 resteasy jar 中的 Response 类,它包含该方法似乎很好。我尝试提取许多其他 jar ,以便它提供冲突。下面是我处理 resteasy 的 POM 的一部分

<!-- Resteasy rest services -->
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>jaxrs-api</artifactId>
            <version>3.0.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.0.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson-provider</artifactId>
            <version>3.0.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxb-provider</artifactId>
            <version>3.0.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-multipart-provider</artifactId>
            <version>3.0.10.Final</version>
        </dependency>

我怀疑它可能是 tomEE lib 文件夹中的某个 jar 导致冲突但找不到任何 jar。

问题 1:如果是这种情况,TomEE/Tomcat 中是否有一种方法可以强制应用程序从应用程序 WEB-INF/lib 文件夹而不是服务器 lib 文件夹中获取 jar。就像在 weblogic 中一样,我们可以通过将 jar 路径放在 prefer-application-package 标记中来更新 weblogic-application.xml。

问题 2:所有搜索都表明这是一个 jar 冲突问题。但是,如果它是应用程序的内部 jar 冲突,那么相同的 jar 结构如何在 weblogic 或其他服务器中工作?某些服务器是否具有比其他服务器更好的应用程序 jar 管理结构?

最佳答案

这是因为 Tomee lib 有另一个 jar 文件“javaee-api-6.0-6.jar”,它也有具有相同命名空间的 Response 类,所以它与 jax-rs jar 中的类名冲突。 Jax-rs 正在获取 Tomee lib jar 的 Response 类,它没有必需的方法。

关于spring - TOMEE + Spring + JAX-RS (NoSuchMethodError) jar 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662277/

相关文章:

java - Spring LDAP 空指针异常

java - 忽略 spring properties file not found 异常

java - NoClassDefFoundError 每一次 Tomcat 重启

ssl - Mobilefirst 8.0 Java 适配器 SSL

java - 如何使用 "?"no get Path Rest?

java - 传递到 URI 的参数无效

java - InvalidClassException 错误,不是典型错误

java - Spring RESTful服务应用架构

java - 使用Java代码或数据库功能插入随机帐号?

java - 配置现有 Tomcat6 和 Eclipse 时遇到问题