【问题标题】:Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]
【发布时间】:2017-08-19 21:10:52
【问题描述】:

我正在尝试构建一个 SpringBoot 应用程序。

 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.ApplicationContext;

    @SpringBootApplication
    public class App {

        @SuppressWarnings("unused")
        public static void main(String[] args) throws Exception {
            ApplicationContext ctx = SpringApplication.run(App.class, args);
        }
    }

但是,当我尝试运行该应用程序时,它会抛出以下错误:

2017-03-27 13:55:58.281  INFO 8608 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-03-27 13:55:58.299  INFO 8608 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2017-03-27 13:55:58.302  INFO 8608 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.11
2017-03-27 13:55:58.554 ERROR 8608 --- [cat-startStop-1] org.apache.catalina.core.ContainerBase   : A child container failed during start

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_73]
    at java.util.concurrent.FutureTask.get(FutureTask.java:192) [na:1.8.0_73]
    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_73]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_73]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_73]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_73]
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

我目前的 pom.xml 文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>XXXX</groupId>
  <artifactId>XXXX</artifactId>
  <version>0.0.1-SNAPSHOT</version>

<!-- JSON -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

 <dependency>
   <groupId>commons-lang</groupId>
   <artifactId>commons-lang</artifactId>
   <version>2.2</version>
 </dependency>

<dependency>
   <groupId>com.sun.jersey</groupId>
   <artifactId>jersey-client</artifactId>
   <version>1.19.3</version>
</dependency >

<dependency>
   <groupId>com.sun.jersey</groupId>
   <artifactId>jersey-json</artifactId>
   <version>1.19.3</version>
</dependency>

<!-- REST Services  -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>1.5.0.RELEASE</version>
</dependency>  

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

<!-- <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>1.5.0.RELEASE</version>
</dependency> -->


  <!-- SLF4J Logging -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.4</version>
    <scope>compile</scope>
  </dependency>  

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.4</version>
    <scope>runtime</scope>
  </dependency>

  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
    <scope>runtime</scope>
  </dependency> 

  </dependencies>

  <build>
  <sourceDirectory>src</sourceDirectory>
  <plugins>

    <!-- Set a compiler level -->
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.3</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
  </plugins>
</build>
</project>

正如一些 SO 帖子中提到的,我尝试删除 (Jersey)、添加 (embedded tomcat) 依赖项。但错误似乎对更改没有影响。

我还尝试了另一个来自 Spring Tutorials 的简单项目(应用程序)(添加两个数字),它有以下 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>SpringBootDemoProject</groupId>
  <artifactId>SpringBootDemoProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>1.5.0.RELEASE</version>
</dependency>  
 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.0.RELEASE</version>
</dependency>

  </dependencies>
  <build>  
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

这完全没问题。关于为什么会这样的任何指针?

【问题讨论】:

  • 你的依赖列表javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;中有一个不兼容的servlet-api.jar。我认为你有 3.x 版,但你需要 2.1
  • 我使用另一个库,它在内部使用 javax.servlet,它的版本是 3.0.1。我已将我的 pom.xml 文件修改为 &lt;dependency&gt; &lt;groupId&gt;javax.servlet&lt;/groupId&gt; &lt;artifactId&gt;servlet-api&lt;/artifactId&gt; &lt;version&gt;2.2&lt;/version&gt; &lt;/dependency&gt; 并添加到库 &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;javax.servlet&lt;/groupId&gt; &lt;artifactId&gt;javax.servlet-api&lt;/artifactId&gt; &lt;/exclusion&gt; 中。但是,错误还是一样。
  • 查看使用了哪个lib的依赖项

标签: java spring maven tomcat catalina


【解决方案1】:

看起来您的类路径中有不兼容的 Servlet API 版本。 这可能是对 Jersey jars 的依赖。 尝试从 Spring boot starters 中拉出 jersey starter。

org.springframework.boot : spring-boot-starter-jersey

这会将正确的版本带入您的类路径。

【讨论】:

  • 这对我很有帮助。我通过排除所有传递 servlet 依赖项解决了这个问题
【解决方案2】:

我有同样的问题,在注释掉下面的内容后它已修复。以下依赖之一是罪魁祸首。

    <!--  dependency>
    <groupId>me.fhir</groupId>
    <artifactId>fhir</artifactId>
    <version>0.12.0-RELEASE</version>
</dependency-->
<!--  dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.8</version>
</dependency-->
<!-- dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.8</version>
</dependency-->

【讨论】:

    【解决方案3】:

    我猜你必须使用 Eclipse 的 Spring Boot Project template 中提供的默认 ServletInitializer 类。

    //SpringBootApplication.java
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringBootApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootApplication.class, args);
        }
    }
    
    //ServletInitializer.java
    public class ServletInitializer extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(SpringBootApplication.class);
        }
    
    }
    

    如果您没有使用 Spring Boot Starter Project 模板中指定的 ServletInitializer 类,请尝试从您的 App 类扩展 SpringBootServletInitializer

    public class App extends SpringBootServletInitializer
    

    请检查类似的答案here

    【讨论】:

      【解决方案4】:

      对我来说,将 javax.servlet-api 升级到 4.0.1 就行了:

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

      【讨论】:

        【解决方案5】:

        我使用pom.xml 中的tomcat 配置解决了这个问题

        首先进入 tomcat 文件夹并在 bin 中打开cmd 我的路径是:

        C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin&gt;

        使用此命令获取 tomcat 版本

        C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin&gt;catalina.sh version

        在此之后添加这个pom.xml

        <properties>
                <java.version>1.8</java.version>
                <tomcat.version>8.5.43</tomcat.version>
        </properties>
        

        【讨论】:

          猜你喜欢
          • 2017-02-23
          • 2021-05-16
          • 1970-01-01
          • 2018-03-04
          • 2013-08-26
          • 1970-01-01
          • 1970-01-01
          • 2019-08-29
          • 2017-02-16
          相关资源
          最近更新 更多