不同的 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错误信息
Android Gradle 插件Android 依赖管理 ⑤ ( Gradle 依赖优化 | 命令行查看依赖模块 | 依赖冲突问题 | 依赖传递冲突 | 分库冲突 | 依赖分组不同导致冲突 )