ヒトリ歩き

愚痴とかいろいろ書きます

SpringBootのwarファイルをtomcatにデプロイする

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

自作のサンプルソース github.com