2015-06-05 41 views
0

我試圖在TomEE服務器上運行我的應用程序,經過許多麻煩之後,我能夠運行該應用程序。TOMEE + Spring + JAX-RS(NoSuchMethodError)jar衝突

但是由於某種原因,我得到某種形式的RestEasy的,因此錯誤如下罐子衝突每當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中的類,它包括方法似乎很好。我嘗試提取許多其他罐子,以便提供衝突。下面是我的POM處理RestEasy的

<!-- 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文件夾中的一部分。

問題1:如果是這樣的情況下,有沒有辦法在TomEE/Tomcat的,這樣我們就可以迫使應用拿起應用WEB-INF/lib文件夾,而不是服務器的lib文件夾罐子。就像在weblogic中一樣,我們可以通過將jar路徑放在prefer-application-package標籤中來更新weblogic-application.xml。

問題2:所有的搜索都指出這是一個jar衝突問題。但是如果它是一個內部的jar應用程序衝突,如何在weblogic或其他服務器上使用相同的jar結構?有些服務器比其他服務器有更好的應用程序管理結構嗎

+0

儘量把'openejb.api.javax.ws.rs.Path.validation = FALSE'到tomee/conf目錄/ system.properties –

+0

嘿@HowardWang謝謝,我試過了,但它並沒有幫助。仍然得到相同的例外。 –

+0

你爲什麼在TomEE上使用resteasy?它捆綁CXF。 –

回答

1

這是因爲Tomee lib有另一個jar文件「javaee-api-6.0-6.jar」,它也具有相同命名空間的Response類,所以它與jax-rs jar中的類名衝突。 Jax-rs正在獲取Tomee lib jar的Response類,該類沒有必要的方法。

+0

我們如何告訴應用程序首先從web-inf/lib加載? –

0
Suggesting 3 solutions to your problem.All 3 solutions are working for me.Let me know if it works for you. 

1)使用Tomcat服務器與你相同的pom.xml

2)修改的pom.xml。使用tomee服務器。

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxrs</artifactId> 
    <version>2.2.1.GA</version> 
</dependency> 

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jackson-provider</artifactId> 
    <version>2.2.1.GA</version> 
</dependency> 

3)使用jersey jax-rs實現。使用tomee服務器。

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.19</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-servlet</artifactId> 
    <version>1.19</version> 
</dependency>