最近在学习微服务的时候启动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.jar
和 tomcat-embed-core-9.0.41.jar
这两个 JAR 包中。由于存在多个不兼容的版本,导致了调用失败。
要解决这个问题,你需要确保应用程序的类路径中只包含一个兼容的版本的 javax.servlet.ServletContext
类。
【2】我在网上看到一个这样的解决方案:https://blog.csdn.net/weixin_40796433/article/details/111881916
这样并不是不可以,但是如果项目重新加载的话仍然还需要进行调整。
【3】更好的方法是保证项目只包含一个特定的 JAR 包
可以在 pom.xml
文件中声明依赖,并排除掉不需要的传递性依赖。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>