不同的 servlet-api 版本冲突

Posted

技术标签:

【中文标题】不同的 servlet-api 版本冲突【英文标题】:Different servlet-api versions collision 【发布时间】:2013-04-01 15:07:22 【问题描述】:

我正在使用 Maven 和 Jetty 作为服务器开发 RestEasy Web 服务。其中一项服务应使用扩展 javax.servlet.http.HttpServletResponseWrapper 的过滤器。问题出在来自 servlet-api 2.3 的接口 javax.servlet.ServletResponse 的方法 setCharacterEncoding 中。我收到以下异常

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

我已经指定了 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>

但是,在 Maven 存储库中,始终有 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.xml 和web.xml

谢谢

【问题讨论】:

我很困惑,这个com.webapp. 包是你写的吗?您是在运行时还是编译时收到此错误?如果在运行时,您要部署到哪个容器(请具体版本)?能否请您在pom.xml 文件中发布相关依赖项? com.webapp。是我的代码。该错误发生在运行时,正是在调用必须提供 jsonp 的特定 restful 服务时。我更新了我的原始帖子,因此它包含更多详细信息。 【参考方案1】:

根据servlet api javadoc...

javax.servlet.HttpSevletResponseWrapper.setCharacterEncoding(String) 从 Servlet API 2.4 开始就存在。

你有一些事情要处理。

    WEB-INF/web.xml 中设置您的 Servlet API 版本 确保在您的项目中使用适当的 Servlet API 来运行您打算在其上运行的 Jetty 版本。 Jetty 6 - Servlet API 2.4 Jetty 7 - Servlet API 2.5 Jetty 8 - Servlet API 3.0 Jetty 9 - Servlet API 3.1 从 maven 获取适当的 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>

【讨论】:

感谢您的回答。我不知道所有这些细节。但是,我检查了这些并没有用。我更新了我以前的帖子,所以你可以看到我的配置。我对这个 servlet-api 2.3 感到困惑,它在应用程序编译后出现在 maven 存储库中。你知道它是从哪里来的吗? 没有看到你的构建是不可能的。它可能来自直接依赖或传递依赖。使用$ mvn dependency:tree 查看已解析的依赖关系树,它可能会帮助您查看特定依赖关系到达的位置。 我在帖子中添加了依赖树。我还添加了指向整个 pom.xml 和 web.xml 的链接。我不明白发生了什么事。依赖树只显示 2.5 版本,但我在 pom.xml 中明确添加了 2.4。而且仓库里有2.3,在依赖树里看不到。 $HOME/.m2/repository 中仅存在工件对您当前的活动项目绝对没有影响。不要关注$HOME/.m2/repository,它只是系统上所有 maven 项目的工件的本地缓存。仅使用您声明且属于项目依赖树一部分的工件。 再一次,您不能使用 Servlet API 2.3。您的初始错误消息和 javadoc 非常清楚。您必须使用 Servlet Api 2.4(或更高版本)来修复该特定错误消息。【参考方案2】:

我发现这里有什么问题。在 maven-jetty-plugin 中,我添加了对 commons-logging 的依赖,每次运行 jetty 时都会拉取 servlet-api 2.3。一旦我删除了这个依赖,一切都很好。

感谢您的帮助。

【讨论】:

以上是关于不同的 servlet-api 版本冲突的主要内容,如果未能解决你的问题,请参考以下文章

解决A child container failed during start错误信息

解决A child container failed during start错误信息

Git - 为冲突的版本自动创建不同的文件

不同版本jq冲突问题

Android Gradle 插件Android 依赖管理 ⑤ ( Gradle 依赖优化 | 命令行查看依赖模块 | 依赖冲突问题 | 依赖传递冲突 | 分库冲突 | 依赖分组不同导致冲突 )

发现同一依赖程序集的不同版本之间存在无法解决的冲突