SpringBootで作ったアプリは組み込みTomcatで起動するので別にwarになんてしなくていいんだけど、自分のサーバーには既にコンテナが起動しているためwarにして配布したい。あと、多分組み込みTomcat毎にポート占有すんでしょ?そうするとアプリごとにポート設定分けて作るとかメンドイじゃん、と思うと僕は一路インターネットの海に向かっていた。
基本的にはこちらのエントリを参考にしたメモです。引用ベースでコードを使用させていただきました。
warにするためにpom.xmlで次を追加
warにするのでこれを追加(なぜだかは知らんが)
<packaging>war</packaging>
Tomcatを使う依存性を追加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
このspring-boot-starter-tomcatという依存性はMavenリポジトリを確認すると、別のコンテナを使う場合の依存性らしい
Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by spring-boot-starter-web
@SpringBootApplicationでエンドポイントになるクラスは
- SpringBootServletInitializerを継承する。
- configure( )をオーバーライド
SpringBootServletInitializerを継承しないとどうなるか?warはできるけど、それをコンテナに配置してもアプリ起動が失敗します。
warを従来のコンテナに配置できるようにあれこれバインドするクラスみたいですね。
An opinionated WebApplicationInitializer to run a SpringApplication from a traditional WAR deployment. Binds Servlet, Filter and ServletContextInitializer beans from the application context to the server.
configure( )に関しては以下のように、アプリクラスのClassオブジェクトを返すだけ
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
STSのプロジェトエクスプロラーでcontrol + クリックで【Run As】→【6 Maven build...】→Goalsに「package」を入力→【Run】ボタン押下。他のサイトだと、上記の設定をした後、mvn packageで同じ動作になるみたいですね。
これでプロジェクトフォルダの下にある[target]フォルダにwarができます。あとはこれをデプロイすれば良いだけです。
ちなみにできたwarを解凍してみると空の[META-INF]とweb.xmlなしの[WEB-INF]があるだけでした。(当然依存ライブラリや作ったクラスなどはありますが)