web-dev-qa-db-ja.com

コンポーネント[StandardEngine [Tomcat] .StandardHost [localhost] .TomcatEmbeddedContext []]の開始に失敗しました

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)、追加(埋め込みTomcat)しようとしました。しかし、エラーは変更に影響を与えていないようです。

また、Spring Tutorialsの別の簡単なプロジェクト(アプリ)(2つの数字を追加する)を試してみましたが、これには次の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>

これは完全に正常に機能します。なぜそうなのかについてのポインタはありますか?

6
Betafish

Urクラスパスに互換性のないバージョンのサーブレットAPIがあるようです。これは、Jersey jarsへの依存関係である可能性があります。 Springブートスターターからジャージースターターを引き出してみてください。

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

これにより、適切なバージョンがクラスパスに組み込まれます。

3
Praneeth Ramesh

私の推測では、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

1

私にとっては、javax.servlet-apiを4.0.1にアップグレードすることでうまくいきました。

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

1