おおくまねこ

職業プログラマーです。興味のある話題を書いています。

Scala/sbt で設定した依存関係がコンフリクトしてしまったら

概要

Scala/sbt を使っていて、依存関係で追加したライブラリ間で依存関係が衝突してしまったときにどうすればいいかという内容です。

Java/gradle だと自動的に新しいバージョンを使うようしてくれていたのですが、どうも sbt ではそうはいかないらしいということがわかりました。

その時にどうすれば回避できるのかについて記載しています。

 

事象

自分は scalikejdbcakka-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-coreakka-streamの子依存)が scala-parser-combinators-1.1.2に依存していて、

scalikejdbcscala-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 の公式マニュアルにも説明されていました。

www.scala-sbt.org

 

参考

以下も参考にしました。

ビルドツールのセマンティクスについての説明や検証について書かれて大変勉強になりました。