2013-04-09 78 views
3

我正在開發使用Maven和Jetty作爲服務器的RestEasy Web服務。其中一個服務應該使用擴展了javax.servlet.http.HttpServletResponseWrapper的Filter。問題出在來自servlet-api 2.3的接口javax.servlet.ServletResponse的setCharacterEncoding方法中。我得到以下異常不同的servlet-api版本碰撞

java.lang.NoSuchMethodError: com.webapp.rest.jsonp.HttpServletResponseContentWrapper.setCharacterEncoding(Ljava/lang/String;)V 

我speficied servlet的API 2.4依賴性,這一點,但也試圖與2.5:

<web-app id="WebApp_ID" version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

的Servlet API 2.4這樣的規定:

<dependency> 
<groupId>javax.servlet</groupId> 
<artifactId>servlet-api</artifactId> 
<version>2.4</version> 
    <scope>provided</scope> 
</dependency> 

我使用Maven插件碼頭:

<plugin> 
<groupId>org.mortbay.jetty</groupId> 
<artifactId>maven-jetty-plugin</artifactId> 
<version>6.1.15</version> 
<configuration> 
.... 
<exclusions> 
<exclusion> 
<groupId>javax.servlet</groupId> 
<artifactId>servlet-api</artifactId> 
</exclusion> 
</exclusions> 

我RestEasy的配置:

<dependency> 
<groupId>org.jboss.resteasy</groupId> 
<artifactId>resteasy-jettison-provider</artifactId> 
<version>2.2.2.GA</version> 
<exclusions> 
    <exclusion> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
    </exclusion> 

然而,在行家庫總有兩個2.3和2.4(或2.5)的版本。我無法弄清楚這個2.3版本是否帶有其他的依賴關係。有沒有什麼建議,我怎麼能找到這個以及如何執行servlet-api 2.4來使用。

我的依賴關係樹看起來是如下:

[INFO] [dependency:tree {execution: default-cli}] 
[INFO] com.inextweb.ai:inextweb-ai:war:1.0.0-SNAPSHOT 
[INFO] +- org.htmlparser:htmlparser:jar:2.1:compile 
[INFO] +- org.htmlparser:htmllexer:jar:2.1:compile 
[INFO] +- org.htmlparser:thumbelina:jar:2.1:compile 
[INFO] +- org.htmlparser:sitecapturer:jar:2.1:compile 
[INFO] +- org.htmlparser:filterbuilder:jar:2.1:compile 
[INFO] +- net.sf.jung:jung-api:jar:2.0.1:compile 
[INFO] | \- net.sourceforge.collections:collections-generic:jar:4.01:compile 
[INFO] +- net.sf.jung:jung-algorithms:jar:2.0.1:compile 
[INFO] | \- colt:colt:jar:1.2.0:compile 
[INFO] |  \- concurrent:concurrent:jar:1.3.4:compile 
[INFO] +- net.sf.jung:jung-graph-impl:jar:2.0.1:compile 
[INFO] +- net.sf.jung:jung-visualization:jar:2.0.1:compile 
[INFO] +- org.apache.opennlp:opennlp-tools:jar:1.5.2-incubating:compile 
[INFO] | +- org.apache.opennlp:opennlp-maxent:jar:3.0.2-incubating:compile 
[INFO] | \- jwnl:jwnl:jar:1.3.3:compile 
[INFO] +- net.sf.jwordnet:jwnl:jar:1.4_rc3:compile 
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided 
[INFO] +- org.testng:testng:jar:6.1.1:test 
[INFO] | +- org.beanshell:bsh:jar:2.0b4:test 
[INFO] | +- com.beust:jcommander:jar:1.12:test 
[INFO] | \- org.yaml:snakeyaml:jar:1.6:test 
[INFO] +- commons-pool:commons-pool:jar:1.6:compile 
[INFO] +- commons-codec:commons-codec:jar:1.7:compile 
[INFO] +- commons-lang:commons-lang:jar:2.6:compile 
[INFO] +- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] +- log4j:log4j:jar:1.2.16:compile 
[INFO] +- org.mongodb:mongo-java-driver:jar:2.10.1:compile 
[INFO] +- org.jboss.resteasy:resteasy-jaxrs:jar:2.3.5.Final:compile 
[INFO] | +- org.jboss.resteasy:jaxrs-api:jar:2.3.5.Final:compile 
[INFO] | +- org.scannotation:scannotation:jar:1.0.3:compile 
[INFO] | | \- javassist:javassist:jar:3.12.1.GA:compile 
[INFO] | +- javax.annotation:jsr250-api:jar:1.0:compile 
[INFO] | +- javax.activation:activation:jar:1.1:compile 
[INFO] | +- org.apache.httpcomponents:httpclient:jar:4.1.2:compile 
[INFO] | | \- org.apache.httpcomponents:httpcore:jar:4.1.2:compile 
[INFO] | \- net.jcip:jcip-annotations:jar:1.0:compile 
[INFO] +- org.jboss.resteasy:resteasy-jackson-provider:jar:2.2.2.GA:compile 
[INFO] | +- org.codehaus.jackson:jackson-core-asl:jar:1.6.3:compile 
[INFO] | +- org.codehaus.jackson:jackson-mapper-asl:jar:1.6.3:compile 
[INFO] | +- org.codehaus.jackson:jackson-jaxrs:jar:1.6.3:compile 
[INFO] | \- org.codehaus.jackson:jackson-xc:jar:1.6.3:compile 
[INFO] +- org.jboss.resteasy:resteasy-jettison-provider:jar:2.2.2.GA:compile 
[INFO] | +- org.jboss.resteasy:resteasy-jaxb-provider:jar:2.2.2.GA:compile 
[INFO] | | \- com.sun.xml.stream:sjsxp:jar:1.0.1:compile 
[INFO] | \- org.codehaus.jettison:jettison:jar:1.2:compile 
[INFO] +- org.simpleframework:simple-xml:jar:2.3.6:compile 
[INFO] | +- stax:stax-api:jar:1.0.1:compile 
[INFO] | \- stax:stax:jar:1.2.0:compile 
[INFO] +- dom4j:dom4j:jar:1.6.1:compile 
[INFO] | \- xml-apis:xml-apis:jar:1.0.b2:compile 
[INFO] +- com.google.code.gson:gson:jar:2.2.2:system 
[INFO] +- junit:junit:jar:3.8.2:compile 
[INFO] +- xalan:serializer:jar:2.7.1:compile 
[INFO] +- bouncycastle:bcprov-jdk15:jar:140:compile 
[INFO] +- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile 
[INFO] | +- commons-beanutils:commons-beanutils:jar:1.8.0:compile 
[INFO] | +- commons-collections:commons-collections:jar:3.2.1:compile 
[INFO] | \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile 
[INFO] +- commons-io:commons-io:jar:1.3.2:compile 
[INFO] +- xom:xom:jar:1.1:compile 
[INFO] | +- xerces:xmlParserAPIs:jar:2.6.2:compile 
[INFO] | +- xerces:xercesImpl:jar:2.6.2:compile 
[INFO] | +- xalan:xalan:jar:2.7.0:compile 
[INFO] | \- jaxen:jaxen:jar:1.1-beta-8:compile 
[INFO] |  \- jdom:jdom:jar:1.0:compile 
[INFO] +- org.slf4j:slf4j-api:jar:1.6.6:compile 
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.6:compile 
[INFO] +- org.slf4j:jul-to-slf4j:jar:1.6.6:compile 
[INFO] \- org.slf4j:jcl-over-slf4j:jar:1.6.6:runtime 
[INFO] ------------------------------------------------------------------------ 

,這裏是整個pom.xmlweb.xml

感謝

+0

我很困惑,這是'com.webapp.'包你寫的東西嗎?你是否在運行時或編譯時得到這個錯誤?如果在運行時,你將部署哪個容器(特定版本)?你能否在你的'pom.xml'文件中發佈相關的依賴關係? – 2013-04-10 00:07:06

+0

com.webapp。是我的代碼。錯誤發生在運行時,恰好在特定的restful服務必須提供jsonp時被調用。我更新了原始文章,以便包含更多詳細信息。 – 2013-04-10 03:43:44

回答

0

我發現有什麼問題,他回覆。在maven-jetty-plugin中,我添加了commons-logging的依賴項,每次運行jetty時都會拉動servlet-api 2.3。一旦我刪除了這個依賴關係,一切都很好。

謝謝你的幫助。

10

按照servlet api javadoc ...

javax.servlet.HttpSevletResponseWrapper.setCharacterEncoding(String)已經存在自Servlet API 2.4以來。

你有幾件事要照顧。

  1. WEB-INF/web.xml
  2. 設置你的Servlet API的版本,確保您使用適當的在Servlet API項目爲打算在其上運行的碼頭的版本。
    • 碼頭6 - Servlet API的2.4
    • 碼頭7 - 的Servlet API 2.5
    • 碼頭8 - Servlet API的3.0
    • 碼頭9 - Servlet API的3.1
  3. 抓住適當Servlet API的jar文件從行家
<project> 
    <build> 
    <dependencies> 

     <!-- Servlet API 2.4 --> 
     <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.4</version> 
     <scope>provided</scope> 
     </dependency> 

     <!-- Servlet API 2.5/Standard Location --> 
     <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
     </dependency> 

     <!-- Servlet API 2.5/OSGi bundle ready --> 
     <dependency> 
     <groupId>org.eclipse.jetty.orbit</groupId> 
     <artifactId>javax.servlet</artifactId> 
     <version>2.5.0.v201103041518</version> 
     <scope>provided</scope> 
     </dependency> 

     <!-- Servlet API 3.0/Standard Location/OSGi bundle ready --> 
     <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
     <scope>provided</scope> 
     </dependency> 

     <!-- Servlet API 3.1/Standard Location/OSGi bundle ready --> 
     <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
     <scope>provided</scope> 
     </dependency> 

    </dependencies> 
    </build> 
</project> 
+0

謝謝你的回答。我不知道所有這些細節。但是,我檢查了這些,並沒有奏效。我更新了以前的文章,以便您可以看到我的配置。我對這個servlet-api 2.3感到困惑,它在應用程序編譯後出現在Maven倉庫中。你知道它從哪裏來? – 2013-04-10 03:48:33

+1

沒有看到你的構建,這是不可能的。它可能來自直接依賴或傳遞。使用'$ mvn dependency:tree'來查看已解決的依賴關係樹,它可以幫助您查看特定依賴關係到達的位置。 – 2013-04-10 04:52:58

+0

我在我的文章中添加了依賴關係樹。我還添加了一個鏈接到整個pom.xml和web.xml。我不明白髮生了什麼事。依賴關係樹僅顯示版本2.5,但我在pom.xml中明確添加了2.4。此外,存儲庫中有2.3個,我無法在依賴關係樹中看到它。 – 2013-04-10 05:19:37