servlet依赖冲突引起的报错:An attempt was made to call a method that does not exist.

最近在学习微服务的时候启动eureka的时候发生报错导致启动失败,具体报错如下:

2023-10-31 18:54:04.193 ERROR 12616 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

*************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1355) The following method did not exist: 'java.lang.String javax.servlet.ServletContext.getVirtualServerName()' The method's class, javax.servlet.ServletContext, is available from the following locations: jar:file:/C:/Users/86138/.m2/repository/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar!/javax/servlet/ServletContext.class jar:file:/C:/Users/86138/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.41/tomcat-embed-core-9.0.41.jar!/javax/servlet/ServletContext.class The class hierarchy was loaded from the following locations: javax.servlet.ServletContext: file:/C:/Users/86138/.m2/repository/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar Action: Correct the classpath of your application so that it contains a single, compatible version of javax.servlet.ServletContext

【1】报错原因简单说就是不同依赖之间的servlet版本不同。

程序尝试调用了一个不存在的方法。具体来说,出现了对 javax.servlet.ServletContext.getVirtualServerName() 方法的调用,而该方法实际上并不存在。

错误提示中还给出了相关的类加载信息,显示了 javax.servlet.ServletContext 类在两个地方可用,分别是 servlet-api-2.5.jartomcat-embed-core-9.0.41.jar 这两个 JAR 包中。由于存在多个不兼容的版本,导致了调用失败。

要解决这个问题,你需要确保应用程序的类路径中只包含一个兼容的版本的 javax.servlet.ServletContext 类。

【2】我在网上看到一个这样的解决方案:https://blog.csdn.net/weixin_40796433/article/details/111881916

这样并不是不可以,但是如果项目重新加载的话仍然还需要进行调整。

【3】更好的方法是保证项目只包含一个特定的 JAR 包

可以在 pom.xml 文件中声明依赖,并排除掉不需要的传递性依赖。


    javax.servlet 
    servlet-api
    2.5 
    provided 

你可能感兴趣的:(bug总结,servlet)