SpringBoot の Maven プロジェクトのpom.xmlでは、依存ライブラリのバージョン指定を大抵の場合省略できます。後述の spring-boot-dependencies の中に、SpringBootがサポートしている各種ライブラリのバージョン定義がされており、それを参照するからです。
ここで以前から気になっていたのが、例えば SpringBoot で Tomcat を使用していて、Tomcat側で緊急のセキュリティfixがリリースされた場合、どうやってTomcatのバージョンだけを個別にアップデートするか?という方法でした。本記事ではそれについて実際のサンプルコードで確認してみました。
サンプルコードは以下になります。
-
https://github.com/msakamoto-sf/springboot-lib-version-change-demo
- SpringBoot 2.1.1 を使用したMavenプロジェクトです。
サンプルコードの解説
STS4で生成した SpringBoot 2.1.1 の単純なMavenプロジェクトです。コンテナはデフォルトのTomcatで、h2databaseも追加しています。
リポジトリのpom.xmlは、すでにバージョンをカスタマイズした内容になっています。以下のように <properties>
内で、spring-boot-dependencies 側で定義しているtomcatとh2のバージョンを上書きしています。
<properties>
<java.version>1.8</java.version>
<tomcat.version>9.0.14</tomcat.version>
<h2.version>1.4.196</h2.version>
</properties>
まずはこれを、以下のように生成した当時の状態に戻し、ビルド・実行してみます。
<properties>
<java.version>1.8</java.version>
</properties>
mvnw package
でビルドしたら java -jar (jarファイル)
で実行し、http://localhost:18088/ にアクセスしてください。以下のようなバージョン情報が表示されます。(これは2019-01-02前後の時点のものです)
servletContext.getServerInfo() -> Apache Tomcat/9.0.13
SELECT H2VERSION() -> 1.4.197
これが、spring-boot-dependencies側で事前に埋め込まれたバージョンになります。
これをカスタマイズしてみます。Tomcatについては 9.0.14 がリリースされていましたのでそちらに変更し、h2databaseについては1つバージョンを落として 1.4.196 に変更してみます。
→ 変更結果が、リポジトリのpom.xmlの内容となります。ビルドしなおして実行すると、確かに変更したバージョンが表示されることを確認できるはずです。
spring-boot-dependencies について
STS4が生成したpom.xmlでは、parentにspring-boot-starter-parent:2.1.1.RELEASEが設定されています。この pom.xml を見てみると、依存関係をまとめた spring-boot-dependencies:2.1.1.RELEASE が更にparentとして指定されています。
spring-boot-dependencies の pom.xml を見てみると、 <properties>
に各種ライブラリのバージョンが登録されていました。
<?xml version="1.0" encoding="utf-8"?><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>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<packaging>pom</packaging>
<name>Spring Boot Dependencies</name>
<description>Spring Boot Dependencies</description>
<url>https://projects.spring.io/spring-boot/#</url>
<!-- ... -->
<properties>
<!-- ... -->
<h2.version>1.4.197</h2.version>
<!-- ... -->
<tomcat.version>9.0.13</tomcat.version>
これらの定義は、spring-boot-starter-系のpom.xmlで、個別のライブラリの依存関係での <version>
指定で参照されています。
これにより、アプリケーション側のpom.xmlでは <version>
指定が不要となっています。また、spring-boot-dependencies側では SpringBoot として動作確認が取れているバージョン番号を定義しているわけですので、一貫性が期待できます。「あれ、こっちはこのバージョンで良いんだっけ?」と悩む必要がありません。
もし異なるバージョンを使いたい場合は、アプリ側の pom.xml で同じプロパティを上書きすればOKです。公式リファレンス側での解説は以下を参照してください。
- 13.1 Dependency Management
まとめ
- SpringBoot の依存ライブラリのバージョンをカスタマイズするには、 spring-boot-dependencies 側で定義されているバージョンのプロパティをアプリ側のpom.xmlで上書きすればOK.
- ↑実際にサンプルコードで確認してみた。