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

最近刚刚开始用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

二.如果知道项目引入了别的Servlet-api,排除步骤,仅供参考,每个人都可能不一样!

可以查看项目的依赖,很明显发现了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 来查看依赖图

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

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

强烈any一款IDEA插件,谁用谁知道,我也是今天才发现! Maven Helper

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

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

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

四.解决方案

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

      <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

SpringBoot报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;的更多相关文章

  1. Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader()Ljava/lang/ClassLoader;

    运行tomat  报错: Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader()Lj ...

  2. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;

    问题描述:在eclipse3.7中启动tomcat6时一直出现这个错误, java.lang.NoSuchMethodError: javax.servlet.ServletContext.getCo ...

  3. idea启动springboot项目 报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader()Ljava/lang/ClassLoader;

    有一次启动springboot项目的时候,报了一个非常奇怪的错误,说是找不到servletContext,springboot不是自带tomcat的吗? 在网上找了好久,说是用以下方式解决. 解决方式 ...

  4. Spring boot Unable to start embedded Tomcat报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()

    Spring boot Unable to start embedded Tomcat 报错 java.lang.NoSuchMethodError: javax.servlet.ServletCon ...

  5. 【原】tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决

    现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...

  6. tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()

    JDK版本:jdk1.8.0_77 Tomcat 版本:apache-tomcat-7.0.47 异常重现步骤: 1.完成项目部署 2.启动Tomcat 异常头部信息:java.lang.NoSuch ...

  7. tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决

    现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...

  8. maven项目 @Resource报错 ava.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;

    @Resource 出错 java.lang.NoSuchMethodError: javax.annotation.Resource.lookup() maven项目中,使用@Resource报错. ...

  9. idea 启动java项目报错 java: 程序包javax.servlet.http不存在

    File -- Project Structure

随机推荐

  1. VS2017离线安装入门与出家

    重做系统,并且VS2017也发布有一段时间了,可以试试了. 于是网上搜了下,离线安装要下载他的安装工具. https://www.visualstudio.com/zh-hans/downloads/ ...

  2. mac 命令行安装软件

    第一步需要在mac上安装brew工具 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mas ...

  3. MyBatis的好处及常见问题

    好处 MyBatis持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置 ...

  4. Gigabyte Z170N-WIFI 黑苹果 10.12

    简述 (此文在我的个人博客长期更新)[http://aiellochan.com/2018/02/11/play/Gigabyte-Z170N-WIFI-%E9%BB%91%E8%8B%B9%E6%9 ...

  5. PMP:11.项目采购管理

    项目采购管理包括从项目团队外部采购或获取所需产品.服务或成果的各个过程.  项目采购管理包括编制和管理协议所需的管理和控制过程,例如,合同.订购单.协议备忘录 (MOA),或服务水平协议 (SLA). ...

  6. C++面试基础之回调

    回调函数技术广泛运用在动态库开发(或者类库)中,是使软件模块化的重要手段.回调函数可以看作是一种通知和实现机制,用于控制反转,即模块A调用模块B时,模块B完成一定任务后反过头来调用模块A.在被调用方代 ...

  7. CS61A hw01

    前不久在知乎上看到CS61A 和CS61B spring18 开课的消息.上去看了一眼,发现真的不错,所有proj hw都可以本地测试!也就是说除了没有课程成绩和官方讨论区和TA解答外,这个课完全可以 ...

  8. PackageManager整理

    一.PackageManager的功能 1.安装.卸载应用.2.查询permission相关信息.3.查询Application相关信息(application,activity,receiver,s ...

  9. [Swift]错误提示:Method does not override any method from its superclass

    问题原因:方法名称书写错误! ViewController 生命周期 // 加载视图时会调用该方法 override func loadView() { super.loadView() print( ...

  10. python 反转一个字符串

    old_str = 'abcd' new_str1 = old_str[::-1] print(new_str1) new_str2 = ''.join(reversed(old_str)) prin ...