当前位置: 代码迷 >> 综合 >> 错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String
  详细解决方案

错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

热度:66   发布时间:2023-09-19 21:15:46.0

最近刚刚开始用SpringBoot做项目,之前项目跑得好好的,就启动不起来了,后来终于解决了这个错误,这种错误出现原因很多吧,我这只能算一种原因。

    直接进入正题,我遇到的导致出现这个报错的原因:maven项目中引入了多个版本的servlet-api的jar包,项目加载时候加载错了类(加载到servlet-api包中的类),getVirtualServerName我只在SpringBoot内嵌的Tomcat的包里见到了!

    解决方案:Servlet-api 3.1.0以及之后的版本中才有getVirtualServerName,确保项目中使用的是这个版本3.1.0以及之后,或者直接排除所有Servlet-api,使用SpringBoot内嵌的tomcat.

一.SpringBoot版本是2.0.0 ,该版本下内嵌Tomcat的jar中就使用了自己的ServletContext,官方文档中标注了该方法在servlet-api 3.1.0才出现,我下载了3.1-b01也是没有该方法的! 所以意味着我们项目如果用了Servlet-api,那版本不得低于3.1.0

     错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

 

错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

     可以查看项目的依赖,很明显发现了servlet-api 2.3 的版本,注意这可能不是你自己引入的(自己引入的解决方法就不用我说了,自己删掉dependency),别的项目引入的话,解决起来就可以参考下面的步骤。

     我也不太了解maven类加载机制,所以说下我觉得可能出现的几个问题,出现这个错误我认为就是加载的是Servlet-api 3.1.0之前的版本(和当前SpringBoot版本不匹配),项目中正好因为我把

axis-saaj的依赖放在了pom文件依赖最前面,而axis-saaj依赖中正好包含了servlet-api的jar,而且用的版本是2.3.0;  如果我将axis-saaj的依赖放在pom依赖最后面,容器又可以正常启动起来

了!

 

 

三.我们就按照axis-saaj在最前面,我们不知道哪个依赖用了servlet-api的情况来排错! jar包那么多,依赖那么多,这次偶然,下次呢?

POM文件中我们右击 Diagram---》 Show Dependencies 来查看依赖图

错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

 

老实说在下面这么大的网状图里找到servlet-api的jar,确实有点困难,先说找到后咋办吧,在servlet-api上右键exclude(快捷键Shift+Delete),即可排除这个版本的servlet-api;

既然找到这个这么困难,还有一种最直接的解决方案:如果项目使用的SpringBoot内嵌的Tomcat,手动添加一个Servlet-api 3.1放到Dependencies里最前面,也可以解决问题.

错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

 

 Maven Helper安装方式就不介绍了,IDEA settings  Plugin中搜索 Maven  Helper,安装、重启就可以使用了. 直接上图,怎么解决这种jar冲突的问题

 

Maven Helper使用方式:  安装成功以后,打开POM文件,红色箭头中内容出现就是安装成功.

错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

 

 切换到依赖分析面板,Dependency Analyzer,然后搜索冲突的jar,在All Dependency界面就可以Exclude,很方便的找到冲突的jar,servlet-api 2.3排除掉,是不是很好很强大呢?

错误:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String

 

综上来看,最优的解决方案是在<Dependencies>下添加Servlet-api 3.1的依赖,最为直接、暴力。此外,也强烈给大家介绍了Maven  Helper插件排除jar依赖的方法

01

02

03

04

05

06

<dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>javax.servlet-api</artifactId>

      <version>3.1.0</version>

      <scope>provided</scope>

  </dependency>

我遇到的是linux上正常运行,windows启动jar包时报以上错误,用下面这个依赖没有排除servlet-api做发邮件时报的错:

<dependency>
            <groupId>com.microsoft.ewsjavaapi</groupId>
            <artifactId>exchange-ws-api</artifactId>
            <version>1.1.5.2</version>
            <exclusions>
                <exclusion>
                      <groupId>javax.servlet</groupId>
                      <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency> 

  相关解决方案