現在リリースされている最新バージョン(2016/12/13時点)はSpring Boot 1.4.2.RELEASEで、デフォルトだとTomcatは8.5.6が使われわれます。Tomcatのバージョンは、SPRING INITIALIZR経由でプロジェクトを作ると簡単にバージョンを変えられます。
ビルドツールとしてMavenをつかっている場合は、以下のようにプロパティでバージョンを指定するだけです。
<properties>
<!-- ... -->
<tomcat.version>8.5.8</tomcat.version>
</properties>
8.5.8を使うとどうなるのか?
とりあえず・・・デフォルトのポート番号(8080)を使うとTomcatが起動しません
エラー内容は「Address already in use」です。ある意味よくみるエラーで、複数のSpring Bootアプリケーションを同時に触っていると起動しっぱなしにしていてこのエラーに遭遇することがあります。
...
2016-12-11 03:12:06.364 ERROR 20786 --- [ main] o.a.coyote.http11.Http11NioProtocol : Failed to start end point associated with ProtocolHandler [http-nio-8080]
java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_102]
at sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_102]
...
でも今回は、別のアプリは起動してませんし、ゾンビプロセスもいません・・・。
じゃあ、なぜAddress already in useなのか?
細かい話は省きますが、Spring Boot上で組み込みTomcat 8.5.8を使うと、TomcatのConnector
が意図せず2つできてしまうのが原因です。デフォだと両方とも8080ポートを使うため「Address already in use」がでてしまう・・・というわけです。
ためしに・・・Spring Bootのプロパティを使ってサーバのポート番号を18080に変更してみると・・・・
server.port=18080
以下のようなログが出てサーバーが起動します。
...
2016-12-11 03:15:39.717 INFO 20842 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 18080 (http)
2016-12-11 03:15:39.721 INFO 20842 --- [ main] com.example.Tomcat858DemoApplication : Started Tomcat858DemoApplication in 2.639 seconds (JVM running for 3.076)
起動はするけど・・・8080(TomcatがつくったConnector)と18080(Spring BootがつくったConnector)でリクエストを待ち受けるTomcatが起動しちゃいました
詳しい原因を知りたい方は・・・
Spring ProjectのProject Memberであり、Spring BootのCore Committerの Andy Wilkinson さんがバグレポートしてくれてました!!
内容は、ここで紹介したものと一緒ですがSpring Boot側にIssue作ってあるのでリンク貼っておきます。
どうすればいいの?
ま〜素直にTomcat 8.5.6を使うのがいいと思います。
何かしらの理由で8.5.6ではなく上位バージョンを使う必要があるなら・・・8.5.9を試してみてください。とりあえず、起動はしました
原因は見てないんですが・・・8.5.9にあげてPRしたらSpring Bootのテストでエラーがでているので、8.5.9でもSpring Bootと組み合わせると一部いまくいかないところがあるかもしれません。
まとめ
特別な理由がない限り、使用しているSpring Bootが依存しているTomcatをそのまま使いましょう〜。
少なくても、過去のSpring Bootのリリースバージョンで使われた実績があるバージョンじゃないと・・・致命的な動作不良に遭遇する危険性が高まることを意識しておいた方がよいでしょう。