93153
以下の記事を参考にしています。  
<https://blogs.lisb.direct/entry/2019-07-01-083000>

GradleにはBOMという仕組みがあります。例えばdependenciesに以下の様に記載した場合、  
[2]の行のライブラリにはバージョン指定の表記がありませんが、  
[1]の行のおかげで[2]のライブラリのバージョンが1.4.199と指定されている扱いになる というのが大まかな機能だと認識しています。

```

    dependencies  {
      implementation platform('org.springframework.boot:spring-boot-starter-parent:2.1.5.RELEASE') // [1]
      runtimeOnly 'com.h2database:h2' // [2]
    }
    
```

これを未知のライブラリでも知る方法を教えて欲しいです。  
上記のspringframeworkであれば、著名なライブラリなので検索すれば解説ページは無数にありますが、  
著名ではないライブラリの場合でも[1]から対応している[2]の一覧を知る方法が知りたいです。

上記の`org.springframework.boot:spring-boot-starter-
parent:2.1.5.RELEASE`のmavenCentralのページは以下だと思いますが、  
<https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-
starter-parent/2.1.5.RELEASE>  
↑このページから`org.springframework.boot:spring-boot-starter-parent:2.1.5.RELEASE`が  
「BOMである」事、「`com.h2database:h2`をバージョン`1.4.199`と指定している」事  
を読み取る方法を教えてください。

例えば、node.jsで`spring-framework`という名前のライブラリについて調べたい場合、  
パッケージ名から以下のURLにアクセスして  
<https://www.npmjs.com/package/spring-framework>  
このページにRepositoryというリンクがあるので以下↓のgithubのページに移動して  
<https://github.com/ArseniyBorezkiy/spring-js>  
package.jsonファイルを開けば、このライブラリのメタデータを全て知る事が出来ます。

Repositoryが無い場合もありますが、その場合でもnpmjs.comからcurlでpackage.json をDLする事が出来ます。  
この様に、どんなマイナーで解説記事やきちんと記載されたreadmeすら無いパッケージでも、とにかくpackage.jsonというテキストファイルを開くことさえ出来れば、そこから情報を知る事が出来ます。

Javaのgradleで指定するライブラリでも、上記の様に確定的にライブラリのメタデータの一次情報を知る方法を教えてください。
CC BY-SA 4.0
2023-01-01T19:10:10.750
93141
2023-01-02T23:42:38.657
805
question
java gradle
JavaのGradleでBOMの対応について調べる方法は？
ここでいう[BOM(Bill of
Materials)](https://maven.apache.org/guides/introduction/introduction-to-
dependency-mechanism.html#bill-of-materials-bom-poms)とは、Maven
POM(`pom.xml`として知られる、Gradleでいうところの
`build.gradle`のようなもの)のうち[継承機能](https://maven.apache.org/pom.html#inheritance)を利用し、ユーザーに利用させることを目的にしたもののことになります。  
したがって、リンク先の説明にある通り、 `packaging` の指定が `pom` であることが必要条件です。  
ただし`packaging: pom`が必ずしもユーザーへのBOMの提供を意図したものとは限りませんので十分条件ではないです。  
単に自プロジェクト内部管理のために作成する場合もあります。

製作者が BOM として提供することを意図して実装したものかどうかは、 `pom.xml` の `<name>`, `<description>`
や実装そのものから類推したり、ユーザーマニュアルで確認することになります。  
(※ 製作者の意図がどうあれ、 `packaging: pom` のものを BOM と同じように使うことはできます)

* * *

Maven Central Repository に登録されているものであれば、Mavenの公式サイト
<https://search.maven.org/> で POM を見ることができます。

例えば `org.springframework.boot:spring-boot-starter-parent:2.1.5.RELEASE` であれば、

  * <https://search.maven.org/artifact/org.springframework.boot/spring-boot-starter-parent/2.1.5.RELEASE/pom>

のリンク先で、

```

    <packaging>pom</packaging>
    
```

が指定されているのがわかります。

ただし今回のものは更に継承元の親がいる(`<parent>`が指定されている)ので、その親も見て見る必要があります。

```

      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
      </parent>
    
```

とありますので、 "org.springframework.boot:spring-boot-dependencies:2.1.5.RELEASE"
などと検索窓から検索すると以下がヒットします:

  * <https://search.maven.org/artifact/org.springframework.boot/spring-boot-dependencies/2.1.5.RELEASE/pom>

ここで次のような情報が定義されているのがわかります。

```

      <properties>
    ...
        <h2.version>1.4.199</h2.version>
    
```

```

      <dependencyManagement>
        <dependencies>
    ...
          <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>${h2.version}</version>
          </dependency>
    
```

* * *

`packaging` が `pom`
であることまでがわかっていれば、ダミーMavenプロジェクトを作成してその情報を表示させてみるのが手っ取り早いかもしれません。  
(※ もしかするとGradleにも同様の機能があるかもしれませんが、私にはわかりません)

具体的には、次のような `pom.xml` を作成し

```

    <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>com.github.yukihane.examples</groupId>
      <artifactId>jaso93141</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
      </dependencyManagement>
    </project>
    
```

次のコマンド([`help:effective-pom`](https://maven.apache.org/plugins/maven-help-
plugin/effective-pom-mojo.html))を実行すれば、継承を開いた状態のPOMが出力されます。

```

    mvn help:effective-pom
    
```

出力:

```

    ...
      <dependencyManagement>
        <dependencies>
    ...
          <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
          </dependency>
    ...
    
```
CC BY-SA 4.0
2023-01-02T20:52:44.697
93153
2023-01-02T23:42:38.657
2023-01-02T23:42:38.657
2808
2808
93141
answer