java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()

923 阅读1分钟

在Servlet 3.1版本后,方法getVirtualServerName才被添加到的ServletContext中。查找java文档的方法getVirtualServerName

出现这个问题至少检查三处可能导致的原因:

  • 1.servlet版本比3.1低

  • 2.其他jar包servlet版本比3.1低

  • 3.tomcat version版本比8低

Ⅰ首先,检查在pom.xml中下面依赖:

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

Ⅱ如果依赖项正确,接下来检查其它jar包中依赖项:

mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>

可以只填写<groupId><artifactId>中的一项,在这里为:

mvn dependency:tree -Dverbose -Dincludes=javax.servlet:javax.servlet-api

执行命令后可能会重新编译一边,编译完毕后输出类似于下面:

[INFO]com.*:*:jar:1.5.6.RELEASE
[INFO] \- javax.servlet:javax.servlet-api:jar:3.1.0:compile

如果servlet-api版本有低于3.1的依赖项,那么在依赖项中去除此依赖,如下:

<!-- exclude servlet-api 2.3 jar-->  
<dependency>  
    <groupId>org.apache.santuario</groupId>  
    <artifactId>xmlsec</artifactId>  
    <version>1.4.3</version>  
    <exclusions>  
        <exclusion>  
            <groupId>javax.servlet</groupId>  
            <artifactId>servlet-api</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency>  

<!-- servlet-api 3.1 version has getVirtualServerName() -->  
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>3.1.0</version>  
</dependency> 

Ⅲ 检查tomcat版本,使用mvn dependency:tree -Dverbose -Dincludes=:*tomcat*命令,若版本号低于8.0,可以通过下面方式指定版本号(查看官方文档):

<properties>
    <tomcat.version>7.0.59</tomcat.version>
</properties>
<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-juli</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    ...
</dependencies>

references:

[1]docs.spring.io/spring-boot…

[2]stackoverflow.com/questions/4…

[3]my.oschina.net/LucasZhu/bl…