在使用Atmosphere servlet的测试WebSocket应用程序中,我遇到以下异常:
SEVERE: Servlet.service() for servlet AtmosphereServlet threw exception
java.lang.ClassNotFoundException: javax.servlet.AsyncContext
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:191)
at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:177)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
从以下帖子中我了解到这可能是由Servlet容器版本早于Servlet 3.0引起的:
ClassNotFoundException: javax.servlet.AsyncContext in Jetty hello world
ClassNotFoundException: javax.servlet.AsyncContext in Jetty hello world in eclipse
Grails project - Servlet call - ClassNotFoundException: javax.servlet.AsyncContext
但是,应用程序在Tomcat7上运行,并在pom.xml中添加了以下依赖项:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
我检查了项目中的所有其他dependensies,但无法找到与Servlet相关的任何其他内容。我仍然是例外。
问题:如何查找应用程序实际使用的jar文件?如何找到导致使用旧版本的依赖项?
答案 0 :(得分:3)
我终于能够通过执行以下操作解决依赖冲突。
要查找应用程序使用的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 ,因为它确实存在于旧的 Servlet 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,其次,&#34;坏&#34; jar位于tomcat目录下的maven存储库中。
经过短暂的研究后,我终于找到了根本原因:在部署和运行maven应用程序时,我需要指定tomcat的具体版本,否则maven使用来自版本6的tomcat的库。所以修复对我来说是改变
mvn -Dmaven.tomcat.port=8080 tomcat:run-war
到
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
希望它可以帮助遇到同样问题的其他人。
答案 1 :(得分:1)