ClassNotFoundException:如何在Java中查找依赖项冲突

在使用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)

但是,该应用程序在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>

我检查了项目中的所有其他依赖项,但找不到与Servlet相关的任何其他内容。不过我还是例外。

如何找到应用程序实际使用的jar文件?如何找到导致使用旧版本的依赖关系?

回答:

通过执行以下操作,我终于能够解决依赖性冲突。

为了找到应用程序使用的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());

}

}

}

选择了类 ,因为它确实存在于旧的 。

上面脚本的执行给我以下内容:

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

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

希望它可以帮助遇到相同问题的其他人。

以上是 ClassNotFoundException:如何在Java中查找依赖项冲突 的全部内容, 来源链接: utcz.com/qa/409171.html

回到顶部