Help us understand the problem. What is going on with this article?

SpringBoot の依存ライブラリのバージョンをカスタマイズ(Maven版)

More than 1 year has passed since last update.

SpringBoot の Maven プロジェクトのpom.xmlでは、依存ライブラリのバージョン指定を大抵の場合省略できます。後述の spring-boot-dependencies の中に、SpringBootがサポートしている各種ライブラリのバージョン定義がされており、それを参照するからです。

ここで以前から気になっていたのが、例えば SpringBoot で Tomcat を使用していて、Tomcat側で緊急のセキュリティfixがリリースされた場合、どうやってTomcatのバージョンだけを個別にアップデートするか?という方法でした。本記事ではそれについて実際のサンプルコードで確認してみました。

サンプルコードは以下になります。

サンプルコードの解説

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です。公式リファレンス側での解説は以下を参照してください。

まとめ

  • SpringBoot の依存ライブラリのバージョンをカスタマイズするには、 spring-boot-dependencies 側で定義されているバージョンのプロパティをアプリ側のpom.xmlで上書きすればOK.
  • ↑実際にサンプルコードで確認してみた。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away