spring-bootでは、例えば以下のようにparentとdependencyを指定しておけば、spring-web
とかspring-mvc
とかの依存性をよしなに解決してくれる。以下のように書くとspring-webmvc-5.2.1.RELEASE.jar
が解決されるが、このエントリではそれがどのようにして行われるのか? を勉強したメモを残しておく。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
spring-boot-starter-webのdependencies
まず、spring-boot-starter-web
のpom.xml
を見るとspring-webmvc
のdependencyがあるのが分かる。ただしversionについては記載が無い。よって、parentであるspring-boot-starter-parent
の親子階層を見ていく。
<dependencies> <!-- 省略 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> </dependencies>
spring-boot-parentの階層
次に、parentで指定するspring-boot-starter-parent
の親子階層から見ていく。
- spring-boot-build
- spring-boot-dependencies
- spring-boot-parent
- spring-boot-starters
- spring-boot-starter-web (module)
- spring-boot-starter-test (module)
- ... (module)
- spring-boot-starters
- spring-boot-parent
- spring-boot-dependencies
spring-boot-starter-parent
は上記のような階層になっている。また、spring-boot-starter-web
やspring-boot-starter-test
は、spring-boot-parent
の子のspring-boot-starters
のmodule、という構造になっている。
spring-boot-buildでspring-framework-bomをimport
spring-webmvc
のversionは親階層のどこかで指定しているハズだが、ここでには直接書かれてはいない。
まず、以下のようにspring-framework-bom
をdependencyManagement
でimportしている。
<properties> <!-- 省略 --> <spring-framework.version>5.2.2.BUILD-SNAPSHOT</spring-framework.version> <!-- 省略 --> </properties> <dependencyManagement> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring-framework.version}</version> <scope>import</scope> <type>pom</type> </dependency>
spring-framework-bom-5.2.1.RELEASE*1をimportしている。で、ここで具体的なversionと共にspring-webmvc
が書いてある。
<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</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.2.1.RELEASE</version> <packaging>pom</packaging> <name>Spring Framework (Bill of Materials)</name> <!-- 省略 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.1.RELEASE</version> </dependency>
基本的にはこのようなparent・importの関係によってdepedencyが解決されるのが分かる。
bomとdependencyManagementで必要なライブラリだけ使用する
spring-framework-bom-5.2.1.RELEASEには様々なspring関連ライブラリが並んでいるが、spring-boot-starter-web
だけだとspring-web
とspring-mvc
しか使われない。これはmavenのbomという仕組みを使用している。
bomとは、ライブラリ提供者が複数ライブラリのversionの意図した組み合わせ、を記述したもの。使用者はそこから必要なものだけを使用するが、これはmavanのdependencyManagement
で実現する。これは名前の通りdependencyを管理するもので、dependencyManagement
をparenで親子関係にしたりimportしたりしてもdependencyとして解決されず、<dependencies><dependency>...
を記述すると依存性として解決される。ただし、versionは省略出来てdependencyManagement
のversionが使用される。これによって、使用者は必要なライブラリだけ、かつ、開発者が意図したversionのものを使用できる。
なお、上記のbomやdependencyManagement
の解説はあくまで自分の言葉で書いたものなので、詳細な定義が必要な場合は公式リファレンス等を参照してください。
まとめ
というわけで、
- spring関連ライブラリのbomをimport
- そのversionはparenの親子関係で指定
のようなタテ・ヨコの関係を駆使した構造になっている。