Scala/sbt で設定した依存関係がコンフリクトしてしまったら
概要
Scala/sbt を使っていて、依存関係で追加したライブラリ間で依存関係が衝突してしまったときにどうすればいいかという内容です。
Java/gradle だと自動的に新しいバージョンを使うようしてくれていたのですが、どうも sbt ではそうはいかないらしいということがわかりました。
その時にどうすれば回避できるのかについて記載しています。
事象
自分は scalikejdbc
とakka-stream
を依存関係に追加した時に、scala-parser-combinators
のコンフリクトで発生しました。
lazy val akkaPj = project
.in(file("akkaPj"))
.settings(
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-stream" % "2.6.17",
"org.scalikejdbc" %% "scalikejdbc" % "4.0.+",
)
)
sbt の読み込みを行うと以下のような結果になります。
[error] java.lang.RuntimeException: found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[error]
[error] * org.scala-lang.modules:scala-parser-combinators_2.13:2.1.0 (early-semver) is selected over 1.1.2
[error] +- org.scalikejdbc:scalikejdbc-core_2.13:4.0.0 (depends on 2.1.0)
[error] +- com.typesafe:ssl-config-core_2.13:0.4.2 (depends on 1.1.2)
ssl-config-core
(akka-stream
の子依存)が scala-parser-combinators-1.1.2
に依存していて、
scalikejdbc
がscala-parser-combinators-2.1.0
に依存しているため、
コンフリクトが発生している状況になります。
対応方法
dependencyOverrides
を sbt で設定することで対応できました。
ここで指定したライブラリをそのバージョンで override することができました。
lazy val akkaPj = project
.in(file("akkaPj"))
.settings(
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-stream" % "2.6.17",
"org.scalikejdbc" %% "scalikejdbc" % "4.0.+",
),
dependencyOverrides += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.0"
)
今回ではscala-parser-combinators-2.1.0
を優先する設定にしています。
以下の sbt の公式マニュアルにも説明されていました。
参考
以下も参考にしました。
ビルドツールのセマンティクスについての説明や検証について書かれて大変勉強になりました。