【问题标题】:Spring Boot 1.5.2 Startup: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;Spring Boot 1.5.2 启动:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
【发布时间】:2017-09-11 13:37:29
【问题描述】:

我从 Spring Boot 1.5.2 版中收到以下错误。在跟踪它的拉动tomcat 8.5.11 版,我使用javax.servlet 3.1 版。我到处都说版本 3.1 应该是解决问题的方法,但我仍然拥有它,即使在删除 .m2 目录下的存储库之后也是如此。

    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) [na:1.8.0_66]
    at java.util.concurrent.FutureTask.get(FutureTask.java:192) [na:1.8.0_66]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872) [tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.11.jar:8.5.11]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_66]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.11.jar:8.5.11]
    ... 6 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11]
    ... 6 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:170) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11]
    ... 8 common frames omitted
    Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
    at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1137) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.11.jar:8.5.11]
    ... 10 common frames omitted

这是我要导入的依赖项列表:

   <properties>
    <tomcat.version>8.5.11</tomcat.version>
</properties>
<dependencies>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1206-jdbc42</version>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.0.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>4.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.6.0</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>
</dependencies>

【问题讨论】:

  • 尝试更新你的本地maven仓库
  • 我复制我的答案。希望对你有帮助!如果您有任何问题,请告诉我!
  • 这发生在我在 intelliJ 中运行 spring boot 时,我相信 IntelliJ 正在将 groovy 中的 servlet-api 2.4 泄漏到我的类路径中。我想它一定在我的项目类路径中,但不知道如何修复它。它显然不是 maven。

标签: java spring tomcat spring-boot


【解决方案1】:

尝试改变

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

【讨论】:

    【解决方案2】:

    我在 pom.xml 中用这个修复了它

      <properties>
        <tomcat.version>7.0.56</tomcat.version>
      </properties>
    

    【讨论】:

      【解决方案3】:

      在 Servlet 3.1 的 ServletContext 中添加了 getVirtualServerName 方法。找到java doc的方法getVirtualServerName

      这个问题至少有 3 个原因:

      1. 您的 servlet 版本比 3.1 旧。

      2. 其他 jar 的 servlet 版本低于 3.1。

      3. 您的 tomcat 版本低于 8

      要解决它,你可以试试下面的方法。

      我。检查您的 pom.xml 是否有以下代码。

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

      如果你的 pom.xml 有上面的代码,它仍然会有这个问题。你可以做第二种方法。

      二。要检查您的其他 jar,请参阅 javax.servlet-api jar。例如,org.apache.santuario 引用了javax.servlet-api jar。 pom.xml:

      <dependency>  
          <groupId>org.apache.santuario</groupId>  
          <artifactId>xmlsec</artifactId>  
          <version>1.4.3</version>   
      </dependency> 
      

      但是当您查看 maven 依赖项时,它指的是 javax.servlet-api jar,其 2.3 版本比 3.1 旧。

      所以你应该排除 2.3 版本。 pom.xml:

      <!-- 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> 
      

      三。 spring boot 运行默认的 tomcat 7。所以定义你的 tomcat 版本 8 而不是 tomcat 7。所以在你的 pom.xml 中添加代码:

         <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
              <java.version>1.8</java.version>
              <tomcat.version>8.5.5</tomcat.version>
          </properties>
      

      【讨论】:

        【解决方案4】:

        就我而言,我添加了两个库,它们将javax.servlet:javax.servlet-api两个不同版本添加到同一个项目构建中。所以排除了一个,然后问题就解决了。

        【讨论】:

          猜你喜欢
          • 2018-12-30
          • 1970-01-01
          • 2017-05-27
          • 2016-02-07
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多