我终于能够通过执行以下操作来解决依赖冲突。
为了找到应用程序使用的 jar 文件,我使用了下面的简单代码:
public void listJarFilesAndClassVersions() {
Class classToCheck = javax.servlet.ServletRequestWrapper.class;
URL location = classToCheck.getResource('/'
+ classToCheck.getName().replace('.', '/') + ".class");
System.out.println(location.toString());
for(Package p : Package.getPackages()) {
if (p.getName().startsWith("javax.servlet")) {
System.out.println("Class: " + p.getName()
+ ", version: " + p.getSpecificationVersion());
}
}
}
班上javax.servlet.ServletRequestWrapper被选中是因为它确实存在于旧的小服务程序2.5.
上述脚本的执行给出了以下结果:
jar:file:/C:/Users/[username]/.m2/repository/org/apache/tomcat/servlet-api/6.0.29/servlet-api-6.0.29.jar!/javax/servlet/ServletRequestWrapper.class
Class: javax.servlet.jsp, version: 2.1
Class: javax.servlet, version: 2.5
Class: javax.servlet.http, version: null
所以,首先,确认使用的是2.5版本的Servlet,其次,“坏”的jar位于tomcat目录下的maven存储库中。
经过短暂的研究,我终于找到了根本原因:在部署和运行maven应用程序时,我需要指定tomcat的具体版本,否则maven使用版本6的tomcat中的库。所以对我来说修复是改变
mvn -Dmaven.tomcat.port=8080 tomcat:run-war
to
mvn -Dmaven.tomcat.port=8080 tomcat7:run-war
现在,如果我执行上面的脚本,它会给出以下结果:
jar:file:/C:/Users/[username]/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/7.0.47/tomcat-embed-core-7.0.47.jar!/javax/servlet/ServletRequestWrapper.class
Class: javax.servlet.jsp, version: 2.2
Class: javax.servlet, version: 7.0
Class: javax.servlet.http, version: 7.0
Class: javax.servlet.annotation, version: 7.0
Class: javax.servlet.descriptor, version: 7.0
希望它可以帮助遇到同样问题的其他人。