このページは、特にビルド定義、スコープ、タスクグラフについて、以前の入門ページを読んでいることを前提としています。
ライブラリ依存関係は2つの方法で追加できます
lib
ディレクトリに配置されたJARファイルです。ほとんどの人は、アンマネージドではなくマネージド依存関係を使用します。しかし、アンマネージドは開始時にはよりシンプルです。
アンマネージド依存関係は次のように機能します。JARファイルをlib
に追加すると、プロジェクトのクラスパスに配置されます。それだけです!
ScalaCheck、Specs2、ScalaTestなどのテストJARもlib
に配置できます。
lib
内の依存関係は、すべてのクラスパス(compile
、test
、run
、console
)に適用されます。これらのいずれかのクラスパスだけを変更したい場合は、たとえばCompile / dependencyClasspath
またはRuntime / dependencyClasspath
を調整します。
アンマネージド依存関係を使用するためにbuild.sbt
に追加するものは何もありませんが、lib
ではなく別のディレクトリを使用したい場合は、unmanagedBase
キーを変更できます。
lib
の代わりにcustom_lib
を使用するには
unmanagedBase := baseDirectory.value / "custom_lib"
baseDirectory
はプロジェクトのルートディレクトリなので、ここではタスクグラフで説明されている特別なvalue
メソッドを使用して、baseDirectory
に応じてunmanagedBase
を変更しています。
unmanagedBase
ディレクトリからのJARファイルをリストするunmanagedJars
タスクもあります。複数のディレクトリを使用したり、他の複雑な処理を行いたい場合は、unmanagedJars
タスク全体を、別の処理を行うタスク(例:lib
ディレクトリ内のファイルに関係なく、Compile
設定のリストを空にする)に置き換える必要があるかもしれません。
Compile / unmanagedJars := Seq.empty[sbt.Attributed[java.io.File]]
sbtはCoursierを使用してマネージド依存関係を実装しているため、Coursier、Apache Ivy、またはMavenに精通している場合は、それほど苦労しません。
libraryDependencies
キー ほとんどの場合、libraryDependencies
設定に依存関係をリストするだけで済みます。Maven POMファイルまたはIvy設定ファイルを作成して依存関係を外部的に設定し、sbtがそれらの外部設定ファイルを使用することも可能です。詳細についてはこちらをご覧ください。
依存関係の宣言は次のようになります。ここで、groupId
、artifactId
、revision
は文字列です。
libraryDependencies += groupID % artifactID % revision
または、configuration
が文字列またはConfiguration
値(Test
など)の場合、次のようになります。
libraryDependencies += groupID % artifactID % revision % configuration
libraryDependencies
はKeysで次のように宣言されています。
val libraryDependencies = settingKey[Seq[ModuleID]]("Declares managed dependencies.")
%
メソッドは文字列からModuleID
オブジェクトを作成し、それらのModuleID
をlibraryDependencies
に追加します。
もちろん、sbt(Coursier経由)はモジュールをどこからダウンロードするかを知る必要があります。モジュールがsbtが付属するデフォルトのリポジトリのいずれかに存在する場合は、そのまま動作します。たとえば、Apache Derbyは標準のMaven2リポジトリにあります。
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"
それをbuild.sbt
に入力してupdate
を実行すると、sbtはDerbyをCoursierキャッシュにダウンロードします。(ちなみに、update
はcompile
の依存関係なので、ほとんどの場合、update
を手動で入力する必要はありません。)
もちろん、++=
を使用して、一度に複数の依存関係を追加することもできます。
libraryDependencies ++= Seq(
groupID % artifactID % revision,
groupID % otherID % otherRevision
)
まれに、libraryDependencies
で:=
を使用する理由が見つかる場合があります。
%%
を使用した正しいScalaバージョンの取得 organization % moduleName % version
ではなくorganization %% moduleName % version
(違いはorganization
の後の二重の%%
)を使用すると、sbtはプロジェクトのバイナリScalaバージョンをアーティファクト名に追加します。これは単なるショートカットです。%%
なしで記述することもできます。
libraryDependencies += "org.scala-stm" % "scala-stm_2.13" % "0.9.1"
ビルドのscalaVersion
が2.13.12
であると仮定すると、次のものは同一です("org.scala-stm"
の後の二重の%%
に注意してください)。
libraryDependencies += "org.scala-stm" %% "scala-stm" % "0.9.1"
多くの依存関係は複数のScalaバージョンに対してコンパイルされており、バイナリ互換性を確保するためにプロジェクトと一致するものを取得したいという考えです。
詳細については、クロスビルドを参照してください。
organization % moduleName % version
のversion
は、単一の固定バージョンである必要はありません。Ivyは、指定された制約に従って、モジュールの最新リビジョンを選択できます。"1.6.1"
のような固定リビジョンではなく、"latest.integration"
、"2.9.+"
、または"[1.0,)"
を指定します。詳細については、Ivyリビジョンのドキュメントを参照してください。
場合によっては、Mavenの「バージョン範囲」(例:[1.3.0,)
)を使用して依存関係(推移的またはその他)を指定することがあります。依存関係の特定のバージョンがビルドで宣言されており、その範囲を満たしている場合、sbtは指定されたバージョンを使用します。そうでない場合、Coursierはインターネットにアクセスして最新バージョンを見つける可能性があります。これにより、ライブラリの範囲条件を満たす特定のバージョンが指定されている場合でも、有効なバージョンが時間の経過とともに変化するという予期しない動作が発生する可能性があります。
ビルド内で満足できるバージョンが見つかった場合に使用するように、Mavenのバージョン範囲は下限に置き換えられます。この動作を無効にするには、JVMフラグ-Dsbt.modversionrange=false
を使用します。
すべてのパッケージが同じサーバーにあるわけではありません。sbtはデフォルトで標準のMaven2リポジトリを使用します。依存関係がデフォルトのリポジトリのいずれにもない場合は、リゾルバーを追加してIvyがそれを検索できるようにする必要があります。
追加のリポジトリを追加するには、次を使用します。
resolvers += name at location
2つの文字列の間に特別なat
を使用します。
例:
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
resolvers
キーはKeysで次のように定義されています。
val resolvers = settingKey[Seq[Resolver]]("The user-defined additional resolvers for automatically managed dependencies.")
at
メソッドは2つの文字列からResolver
オブジェクトを作成します。
リポジトリとして追加すると、sbtはローカルMavenリポジトリを検索できます。
resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
または、便宜上
resolvers += Resolver.mavenLocal
他のタイプのレポジトリの定義の詳細については、Resolversを参照してください。
resolvers
には、デフォルトのレゾルバーは含まれません。ビルド定義によって追加されたもののみが含まれます。
sbtは、resolvers
といくつかのデフォルトのリポジトリを組み合わせてexternalResolvers
を形成します。
したがって、デフォルトのレゾルバーを変更または削除するには、resolvers
ではなくexternalResolvers
をオーバーライドする必要があります。
多くの場合、依存関係はテストコード(src/test/scala
、Test
構成によってコンパイルされる)で使用されますが、メインコードでは使用されません。
依存関係をTest
構成でのみクラスパスに表示させ、Compile
構成には表示させたくない場合は、次のように% "test"
を追加します。
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % "test"
Test
構成の型安全なバージョンも次のように使用できます。
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % Test
これで、sbtインタラクティブプロンプトでshow Compile/dependencyClasspath
と入力すると、derby jarは表示されません。しかし、show Test/dependencyClasspath
と入力すると、derby jarがリストに表示されます。
通常、ScalaCheck、Specs2、ScalaTestなどのテスト関連の依存関係は、% "test"
で定義されます。
ライブラリ依存関係に関する詳細とヒントは、このページにあります。