1. 序章

SBTは、ScalaおよびJavaプロジェクト用のインタラクティブなビルドツールです。 Scalaプロジェクトのコンパイルをネイティブでサポートし、いくつかのScalaテストライブラリと統合します。 また、Scalaでタスクを定義し、インタラクティブシェルからそれらを並行して実行することもできます。

build.sbt ファイルには、依存関係の詳細など、プロジェクトのビルドに必要な情報が含まれています。 前回の記事では、SCalaアプリをSBTでパッケージ化する方法について詳しく説明しました。

この記事では、SBTを使用して構築しているプロジェクトで依存関係を除外する方法を見ていきます。

2. 依存関係から依存関係を除外する

build.sbt ファイルには、プロジェクトの依存関係情報が含まれています。 このファイルでは、プロジェクトに含める依存関係と除外する依存関係を定義できます。 多くの場合、依存関係にはさらに依存関係が含まれています。 これらを一時的な依存関係と呼びます。

多くの場合、これらの推移的な依存関係を含めたくない状況になります。たとえば、すでに手動で依存関係を含めている場合や、別の依存関係にすでに推移的な依存関係が含まれているために含めたくない場合などです。実行時にバージョンの問題があります。 したがって、依存関係に不要な他の依存関係が含まれないようにする機能が重要です。

excludeまたはexcludeAllキーワードのいずれかを使用してSBTの依存関係を除外します。 どちらを使用するかを理解することが重要です。excludeAllはより柔軟性がありますが、pom.xmlで表すことはできません。 したがって、プロジェクトに対してpom.xml が公開される場合は、excludeを使用する必要があります。

以下のbuild.sbtの例では、log4jscala-parser-combinatorsの2つの依存関係を追加しています。 log4j 依存関係には、ビルドから除外するjavax.jmxおよびcom.sun.jmx依存関係が含まれます。 exclude キーワードは、除外する組織名とモジュール名の2つの引数を取ります。

scalaVersion := "2.13.8"
name := "sbt-exclude-dependency"
organization := "org.baeldung"
version := "1.0"
libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.1",
  "log4j" %% "log4j" % "1.2.15" exclude("javax.jms", "jms") exclude("com.sun.jmx", "jmxri")
)

同じ例をもう一度見てみましょう。 今回は、 excludeAll キーワードを使用して、同じ依存関係を除外します。

libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.1",
  "log4j" % "log4j" % "1.2.15" excludeAll(
    ExclusionRule(organization = "com.sun.jmx", name = "jmxi"),
    ExclusionRule(organization = "javax.jms"))
)

組織内のすべてのモジュールを除外する場合は、nameパラメーターを省略できます。

3. すべての依存関係から依存関係を除外する

単一の定義された依存関係からではなく、プロジェクト内のすべての依存関係から推移的な依存関係を除外したい場合がよくあります。 これを実現するために、excludeDependenciesExclusionRulesを設定できます。 プロジェクト内のすべての依存関係からcommons-loggingを削除しましょう。

excludeDependencies ++= Seq(
  ExclusionRule("commons-logging", "commons-logging")
)

4. 結論

最後に、excludeおよびexcludeAllを使用してSBTの依存関係を除外する方法について説明しました。 pom.xmlを生成する必要がある場合は、excludeAllよりもexcludeAllを優先することが重要です。

また、 excludeDependencies を使用して、プロジェクト内のすべての依存関係にわたって推移的な除外を定義する方法も確認しました。

build.sbt 内の構文の詳細については、SBTに関する以前の記事の1つを確認してください。