sbt затенение двух версий зависимости

Когда я запускаю свои тесты, я вижу следующую ошибку:

Exception: java.lang.NoSuchMethodError: fs2.Stream$.bracket(Ljava/lang/Object;Lscala/Function1;Lscala/Function1;)Lfs2/internal/FreeC;

Сначала я убедился, что мой файл сборки очищен с помощью явное объявление транзитивных зависимостей и удаление неиспользуемых зависимостей для создания следующего build.sbt:

scalaVersion := "2.12.7"
organization := "com.example "

lazy val lambdas = (project in file("."))
  .settings(
    libraryDependencies += "org.typelevel" %% "cats-core"   % "1.4.0",
    libraryDependencies += "org.typelevel" %% "cats-effect" % "1.0.0",

    libraryDependencies += "io.circe" %% "circe-core"    % "0.10.0",
    libraryDependencies += "io.circe" %% "circe-generic" % "0.10.0",
    libraryDependencies += "io.circe" %% "circe-parser"  % "0.10.0", 
    libraryDependencies += "io.circe" %% "circe-fs2"     % "0.10.0",

    libraryDependencies += "co.fs2" %% "fs2-core" % "1.0.0",
    libraryDependencies += "co.fs2" %% "fs2-io"   % "0.10.0",

    libraryDependencies += "org.http4s" %% "http4s-circe"  % "0.18.0",
    libraryDependencies += "org.http4s" %% "http4s-client" % "0.18.0",
    libraryDependencies += "org.http4s" %% "http4s-core"   % "0.18.0",

    libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3",

    libraryDependencies += "com.amazonaws" % "aws-lambda-java-core" % "1.2.0",
    libraryDependencies += "com.amazonaws" % "aws-java-sdk-core"    % "1.11.422",
    libraryDependencies += "com.amazonaws" % "aws-java-sdk-s3"      % "1.11.422",

    libraryDependencies += "org.scalatest"  %% "scalatest"  % "3.0.5"  % "test",
    libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.14.0" % "test",

    libraryDependencies += "io.findify" %% "s3mock" % "0.2.4" % "test"
  )

Все компилируется, и один из моих двух тестов проходит. Другой терпит неудачу с ошибкой выше. Вот вывод sbt evited:

[warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[warn]  * co.fs2:fs2-core_2.12:1.0.0 is selected over 0.10.0
[warn]      +- io.circe:circe-fs2_2.12:0.10.0                     (depends on 1.0.0)
[warn]      +- com.example:lambdas_2.12:0.1.0-SNAPSHOT             (depends on 1.0.0)
[warn]      +- co.fs2:fs2-scodec_2.12:0.10.0                      (depends on 0.10.0)
[warn]      +- org.http4s:jawn-fs2_2.12:0.12.0                    (depends on 0.10.0)
[warn]      +- co.fs2:fs2-io_2.12:0.10.0                          (depends on 0.10.0)
[warn]  * org.typelevel:cats-effect_2.12:1.0.0 is selected over 0.8
[warn]      +- co.fs2:fs2-core_2.12:1.0.0                         (depends on 1.0.0)
[warn]      +- com.example:lambdas_2.12:0.1.0-SNAPSHOT             (depends on 1.0.0)
[warn]      +- org.http4s:http4s-core_2.12:0.18.0                 (depends on 0.8)
[warn]  * org.typelevel:cats-core_2.12:1.4.0 is selected over {1.0.1, 1.3.1}
[warn]      +- io.circe:circe-core_2.12:0.10.0 ()                 (depends on 1.4.0)
[warn]      +- co.fs2:fs2-core_2.12:1.0.0                         (depends on 1.4.0)
[warn]      +- org.typelevel:cats-effect_2.12:1.0.0               (depends on 1.3.1)
[warn]      +- com.example:lambdas_2.12:0.1.0-SNAPSHOT             (depends on 1.3.1)
[warn]      +- org.http4s:http4s-core_2.12:0.18.0                 (depends on 1.0.1)
[warn]  * io.circe:circe-jawn_2.12:0.10.0 is selected over 0.9.1
[warn]      +- io.circe:circe-parser_2.12:0.10.0 ()               (depends on 0.10.0)
[warn]      +- io.circe:circe-fs2_2.12:0.10.0                     (depends on 0.10.0)
[warn]      +- org.http4s:http4s-circe_2.12:0.18.0                (depends on 0.9.1)
[warn]  * org.spire-math:jawn-parser_2.12:0.13.0 is selected over 0.11.0
[warn]      +- io.circe:circe-jawn_2.12:0.10.0 ()                 (depends on 0.13.0)
[warn]      +- org.http4s:jawn-fs2_2.12:0.12.0                    (depends on 0.11.0)
[warn] Run 'evicted' to see detailed eviction warnings
[info] Here are other depedency conflicts that were resolved:
[info]  * commons-logging:commons-logging:1.1.3 is selected over 1.2
[info]      +- com.amazonaws:aws-java-sdk-core:1.11.422           (depends on 1.1.3)
[info]      +- org.apache.httpcomponents:httpclient:4.5.5         (depends on 1.2)
[success] Total time: 2 s, completed Nov 28, 2018 12:56:33 PM

Судя по sbt-dependency-graph, мне на законных основаниях понадобятся две версии fs2. -ядро: 1.0.0 и 0.10.0.

Это моя попытка использовать затенение sbt-assembly для обработки выселений путем переименования старого версия fs2 в библиотеке http4s, которая в ней нуждается. На самом деле ничего не компилируется с этим файлом сборки, поэтому я предполагаю, что есть несколько проблем с тем, как я все настроил.

//build properties
//sbt.version=1.1.2

//assembly.sbt
//addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.8")

scalaVersion := "2.12.7"
organization := "com.example"

lazy val fatJar = project
  .enablePlugins(AssemblyPlugin)
  .settings(
    libraryDependencies ++= Seq(
      "org.typelevel" %% "cats-core"   % "1.4.0",
      "org.typelevel" %% "cats-effect" % "1.0.0",

      "io.circe" %% "circe-core"    % "0.10.0",
      "io.circe" %% "circe-generic" % "0.10.0",
      "io.circe" %% "circe-parser"  % "0.10.0",
      "io.circe" %% "circe-fs2"     % "0.10.0",

      "co.fs2" %% "fs2-core" % "1.0.0",
      "co.fs2" %% "fs2-io"   % "0.10.0",

      "org.http4s" %% "http4s-circe"  % "0.18.0",
      "org.http4s" %% "http4s-client" % "0.18.0",
      "org.http4s" %% "http4s-core"   % "0.18.0",

      "com.chuusai" %% "shapeless" % "2.3.3",

      "com.amazonaws" % "aws-lambda-java-core" % "1.2.0",
      "com.amazonaws" % "aws-java-sdk-core"    % "1.11.422",
      "com.amazonaws" % "aws-java-sdk-s3"      % "1.11.422",

      "org.scalatest"  %% "scalatest"  % "3.0.5"  % "test",
      "org.scalacheck" %% "scalacheck" % "1.14.0" % "test",

      "io.findify" %% "s3mock" % "0.2.4" % "test"),

    assemblyShadeRules in assembly ++= Seq(
      ShadeRule.rename("co.fs2.**" -> "old_fs2.@1")
        .inLibrary("org.http4s" %% "http4s-circe" % "0.18.0")
        .inLibrary("org.http4s" %% "http4s-core"  % "0.18.0")
    )
  )

lazy val kraken_shaded = (project in file("."))
  .settings(
    name := "kraken-shaded",
    packageBin in Compile := (assembly in (fatJar, Compile)).value

person codenoodle    schedule 28.11.2018    source источник
comment
Это определенно имеет критические изменения. Я надеялся выяснить, как включить оба, но затенить использование внутри пакета http4s, поэтому попадет в fs2 v0.10.0, в то время как остальная часть проекта использует v1.0.0.   -  person codenoodle    schedule 29.11.2018
comment
Ах. Хорошая точка зрения. Затенение могло бы работать, если бы http4s никогда не открывал потоки в своем интерфейсе .... но, конечно, этот пакет работает не так. Я предполагаю, что мои варианты - использовать другую библиотеку http до тех пор, пока не выйдет http4s 0.20.0, или понизить все мои другие зависимости, пока им не понадобится только fs2 0.10.0. Оба варианта довольно неудачные.   -  person codenoodle    schedule 30.11.2018
comment
@LuisMiguelMejíaSuárez, если вы хотите оставить ответ, обобщающий комментарии, я отмечу его как правильный. Я ценю вашу помощь.   -  person codenoodle    schedule 10.12.2018


Ответы (1)


Я не эксперт ни в http4s, ни в fs2, но я считаю, что 1.0.x версия fs2 вносит существенные изменения.
И, как вы можете видеть здесь, http4s 0.18.x построен на основе fs2 0.10.x.
Поэтому я не думаю, что вы сможете заставить их работать вместе.

Вы можете затенить версию 0.10.x fs2 для http4s и использовать версию 1.0.x в своем проекте...
Но я не думаю, что это даже возможно , если вы никогда не используете Stream, созданный http4s, и не передаете Stream в http4s — и это определенно не так, как это работает.

Тем не менее, вы можете использовать http4s 0.20.x.
Сейчас это является вехой, так что вы можете ожидать изменений до того, как она станет стабильной, но пока она может работать, если вы не хотите переходить на fs2 0.10.x.

person Luis Miguel Mejía Suárez    schedule 10.12.2018