我正在尝试在 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/