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>
これは完全に正常に機能します。なぜそうなのかについてのポインタはありますか?
Urクラスパスに互換性のないバージョンのサーブレットAPIがあるようです。これは、Jersey jarsへの依存関係である可能性があります。 Springブートスターターからジャージースターターを引き出してみてください。
org.springframework.boot : spring-boot-starter-jersey
これにより、適切なバージョンがクラスパスに組み込まれます。
私の推測では、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
私にとっては、javax.servlet-apiを4.0.1にアップグレードすることでうまくいきました。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>