1. 概要

このチュートリアルでは、SBTを使用してプロジェクトの依存関係ツリーを確認する理由と方法を説明します。

2. SBTの依存関係

SBT は、Scalaプロジェクトの最も一般的なビルドツールです。 プロジェクトがより複雑になると、依存関係の数が増えます。そして、各依存関係は、推移的な依存関係と呼ばれる他の依存関係をもたらします。 最終的に、プロジェクトはJAR依存関係地獄に悩まされる可能性があります。 この問題は、JARの複数のバージョンがクラスパスに共存する状況として説明できます。 これにより、 ClassLoader がJARから見つかった最初のクラスをロードし、実行時に非常に予期しない結果が発生します。 たとえば、一般的な問題は、一方のバージョンにのみ存在するメソッドを使用していて、ClassLoaderがたまたまもう一方のバージョンをロードする場合です。

3. SBT依存関係ツリー

前の問題を解決する必要がある場合は、依存関係と推移的な依存関係を検査する必要があります。解決策はSBTのバージョンによって異なります。SBT 1.3.x、の場合は project / plugins.sbt ファイルに以下を追加して、sbt-dependency-graphプラグインを含めます。

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")

SBTの場合>=1.4 にはこのプラグインのサポートが組み込まれているため、 project /plugins.sbtに追加する必要があります。

addDependencyTreePlugin

そして、GitHubREADMEファイルにリストされている使用可能なコマンドのいずれかを使用できます。

3.1. 依存関係ツリープラグインの追加

このプラグインを実際のプロジェクトでどのように使用できるか見てみましょう。 例として、Scalaを搭載したGitWebプラットフォームであるGitBucketを選びましょう。これはGitHubやGitLabに似たWebアプリで、運が良ければすでにプラグインセットアップがあり、クローンを作成します。 プラグインリポジトリで使用可能なコマンドから、dependencyTree、dependencyBrowseGraph、dependencyBrowseTreeの3つが特に役立ちます。

3.2. dependencyTreeコマンド

このコマンドは、ASCII表現を使用してプロジェクトの依存関係ツリーを表示します。

$ sbt dependencyTree
[info] welcome to sbt 1.5.5 (N/A Java 15.0.2)
[info] loading settings for project gitbucket-build from build.sbt,plugins.sbt ...
[info] loading project definition from /Users/pedro.rijo/repos/personal/gitbucket/project
[info] loading settings for project root from build.sbt ...
[info] set current project to gitbucket (in build file:/Users/pedro.rijo/repos/personal/gitbucket/)
[info] io.github.gitbucket:gitbucket_2.13:4.36.0 [S]
[info]   +-ch.qos.logback:logback-classic:1.2.3
[info]   | +-ch.qos.logback:logback-core:1.2.3
[info]   | +-org.slf4j:slf4j-api:1.7.25 (evicted by: 2.0.0-alpha1)
[info]   | +-org.slf4j:slf4j-api:2.0.0-alpha1
[info]   |
[info]   +-com.github.takezoe:blocking-slick-32_2.13:0.0.12 [S]
[info]   | +-com.typesafe.slick:slick_2.13:3.3.2 [S]
[info]   |   +-com.typesafe:config:1.3.2 (evicted by: 1.4.1)
[info]   |   +-com.typesafe:config:1.4.1
[info]   |   +-org.reactivestreams:reactive-streams:1.0.2
[info]   |   +-org.scala-lang.modules:scala-collection-compat_2.13:2.0.0 [S]
[info]   |   +-org.slf4j:slf4j-api:1.7.25 (evicted by: 2.0.0-alpha1)
[info]   |   +-org.slf4j:slf4j-api:2.0.0-alpha1

(...)

+-com.googlecode.juniversalchardet:juniversalchardet:1.0.3
[info]     +-org.apache.commons:commons-text:1.9
[info]     | +-org.apache.commons:commons-lang3:3.11
[info]     |
[info]     +-org.scala-lang.modules:scala-parser-combinators_2.13:1.1.2 [S]
[info]     +-org.scala-lang.modules:scala-xml_2.13:1.3.0 [S]
[info]     +-org.scalatra:scalatra-common_2.13:2.7.1 [S]
[info]     +-org.slf4j:slf4j-api:1.7.30 (evicted by: 2.0.0-alpha1)
[info]     +-org.slf4j:slf4j-api:2.0.0-alpha1
[info]
[success] Total time: 1 s, completed Jul 19, 2021, 11:25:53 PM

この出力は、初心者にはあまり理解しにくいかもしれませんが、ASCIIツリー表現です。 プロジェクトのすべての推移的な依存関係が表示されます(ここでは、出力が多すぎないようにトリミングされています)。 依存関係を調べてみましょうブロッキング-スリック-32_2.13。 これはプロジェクトの直接の依存関係です(これは、 build.sbt ファイル)。 この依存関係により、 slick_2.13 依存関係が追加され、 typesafe.config react-streams 、[ X174X]slf4j-apiなど。

3.3. distributionBrowseGraphコマンド

dependencyBrowseGraphは、依存関係グラフを視覚化したブラウザウィンドウを開くため、もう少しユーザーフレンドリーです。速度が遅くなる可能性があるという欠点があります。

$ sbt dependencyBrowseGraph
[info] welcome to sbt 1.5.5 (N/A Java 15.0.2)
[info] loading settings for project gitbucket-build from build.sbt,plugins.sbt ...
[info] loading project definition from /Users/pedro.rijo/repos/personal/gitbucket/project
[info] loading settings for project root from build.sbt ...
[info] set current project to gitbucket (in build file:/Users/pedro.rijo/repos/personal/gitbucket/)
[info] HTML graph written to file:/Users/pedro.rijo/repos/personal/gitbucket/target/graph.html
[info] Opening in browser...
[success] Total time: 3 s, completed Jul 19, 2021, 11:29:00 PM

繰り返しになりますが、トリミングされた結果は次のとおりです。

 

3.4. distributionBrowseTreeコマンド

最後に、dependentencyBrowseTreeは以前の2つのアプローチを組み合わせたものです。ブラウザウィンドウも開きますが、依存関係ツリーの視覚化が表示されます。

$ sbt dependencyBrowseTree
[info] welcome to sbt 1.5.5 (N/A Java 15.0.2)
[info] loading settings for project gitbucket-build from build.sbt,plugins.sbt ...
[info] loading project definition from /Users/pedro.rijo/repos/personal/gitbucket/project
[info] loading settings for project root from build.sbt ...
[info] set current project to gitbucket (in build file:/Users/pedro.rijo/repos/personal/gitbucket/)
[info] HTML tree written to file:/Users/pedro.rijo/repos/personal/gitbucket/target/tree.html
[info] Opening in browser...
[success] Total time: 2 s, completed Jul 19, 2021, 11:31:52 PM

そして、生成された出力を以下に示します。

4. 結論

この記事では、SBTプロジェクトの依存関係を一覧表示する方法を説明しました。 これは、推移的な依存関係の問題を解決するのに役立つ場合があります。 また、依存関係を管理するときに私たちの生活を楽にすることができる3つの異なる視覚化を見ました。