gradleでのbomの作り方

427
NO IMAGE

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
        }
    }
}