SpringBootは、Tomcatが内包されているjarファイルを起動するだけでWebアプリとして動作させることが出来ます。 実際の運用では、SpringBootで内包されたTomcatは使わずに、サーバにTomcatをインストールし、Webアプリをデプロイして運用することになると考えています。
SpringのチュートリアルをTomcatにデプロイすると期待通りに動作しません。 今回は、SpringBootで作成したアプリをTomcatにデプロイするために必要な設定について調べました。
Tomcatにデプロイするための準備は?
TomcatにSpringBootで作成したアプリをデプロイするために、主に2つのことを行う必要があります。
- SpringBootServletInitializerクラスの継承
- ビルドツールのカスタマイズ
SpringBootServletInitializerクラスの継承
アプリのメインクラスで、SpringBootServletInitializerクラスの継承とconfigureメソッドをオーバーライドする必要があります。 オーバーライドしたconfigureメソッドでは、 SpringApplicationBuilderクラスのsources(Class...)メソッドを実行します。(SpringApplicationBuilderクラスは、configureメソッドのパラメータです。)
または、SpringBootServletInitializerクラスを継承したクラスに@Configurationを設定する必要があります。
ですが、SpringBootServletInitializerクラスを継承したクラスに@SpringBootApplicationを設定することで、configureメソッドのオーバーライドが不要になります。
なぜかというと、 @SpringBootApplicationに@SpringBootConfigurationが呼ばれ、@SpringBootConfigurationから@Configurationが呼ばれるためです。
@SpringBootApplication public class HelloWorldApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(HelloWorldApplication.class); } }
ビルドツールのカスタマイズ
ビルドツールは、Gradleを使用することを前提とします。
成果物は、jarではなくwarファイルにする必要があります。
apply plugin: 'war'
または
plugins { /* ... */ id 'war' /* ... */ }
デプロイ先のサーブレットコンテナと組込みサーブレットコンテナが干渉されないように、組込みサーブレットの依存関係を提供済みであることを示す設定をします。
この設定により、spring-boot-starter-tomcat-2.2.5.RELEASE.jarなどの組込みのTomcat関係のjarファイルを、warファイル内のWEB-INF/lib-providedフォルダ配下に格納します。 そして、warファイルはTomcatにデプロイすることが出来る様になり、warファイル単体でも実行することが出来ます。
dependencies { // … providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' // … }
まとめ
Springのチュートリアルには、個別で動作するTomcatにSpringBootで作成したアプリをデプロイするサンプルがなかったので、デプロイする方法を把握することが出来て良かったです。
参考
Tomcatにデプロイするwarファイルの作成について docs.spring.io
SpringBootServletInitialzerクラスのJavadoc docs.spring.io