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

最近把项目由原来的spring + spring mvc 升级到springboot v2.0.2上,可以启动不了,报“
NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String”

这个错。网上说是servlet-api这个jar冲突了,要使用3.1版本。所以我直接引入了:

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

再次启动发现问题如故,实际依赖的还是2.4版本。看来事情没这么简单,后来这遍博客提醒了我:http://outofmemory.cn/code-snippet/10914/maven-command-dependency。在项目根目录下执行“mvn dependency:tree”命令来查看是哪个家伙把server-api.jar引进来的:

[INFO] +- org.httpunit:httpunit:jar:1.7.2:compile
[INFO] |  +- rhino:js:jar:1.6R5:compile
[INFO] |  +- nekohtml:nekohtml:jar:0.9.5:compile
[INFO] |  +- javax.servlet:servlet-api:jar:2.4:compile
[INFO] |  +- net.sf.jtidy:jtidy:jar:r938:compile
[INFO] |  +- xerces:xercesImpl:jar:2.6.1:compile
[INFO] |  \- xerces:xmlParserAPIs:jar:2.6.1:compile

元凶是httpuint了,最后把依赖排除掉:

        <dependency>
            <groupId>org.httpunit</groupId>
            <artifactId>httpunit</artifactId>
            <version>1.7.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency> 

搞定。我的问题其实不是jar冲突,准备说是ServletContext接口冲突 了。项目依赖了tomcat-embed-core-8.5.31.jar已经有ServletContext了,并且ServletContext接口确确实实定义了getVirtualServerName()方法,只不过jvm先加载了servelt-api中的ServletContext类,后来在加载tomcat-embed-core-8.5.31中的ServletContext时发现它已经存在就不再加载了。

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值