BOMが必要な背景
- 言語にかかわらずライブラリを作成する際には、出来る限り依存関係を少なくする事が望ましいです。ですが、ある程度機能が多いライブラリだと、特定の外部のライブラリとの連携が必要になってきます。この連携は、特定の機能を実現する際にのみ必要となので、その場合にのみ依存関係を追加したくなります。
- 上記を満たすためには、アダプタ系のライブラリが必要です。また、それは高機能なライブラリになるにしたがって増えます。
- 依存関係が複雑になり、依存関係の衝突が発生しやすくなります。
- 依存関係のライブラリのバージョンを横断的に別途定義する(bomを定義)することで、バージョンの衝突を防ぎます。
BOMの例
BOMのXML
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>sample-bom</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>3.2</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Gradleでの使用イメージ(build.gradle)
dependencies {
# platform指定で、bomを引き込む
implementation platform(
group: 'test', name: 'sample-bom', version: "0.0.1")
# bomに定義されている依存関係は、version指定が不要
implementation group: 'org.slf4j', name: 'slf4j-api'
implementation group: 'org.eclipse.microprofile', name: 'microprofile'
}
マルチプロジェクトでのbomの生成方法
以下のようなbuild.gradleを持つプロジェクトを追加して、mavenのpublishを実行すればbomが作成されます。
plugins {
id 'java-platform'
}
dependencies {
constraints {
parent.subprojects.sort { it.name }.each {
api it
}
api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
}
}
publishing {
publications {
maven(MavenPublication) {
from components.javaPlatform
}
}
}