Как зависимости работают в Scala?

#scala #sbt #akka

#scala #sbt #akka

Вопрос:

Для моих существующих проектов я выполняю миграцию со scalaVersion 2.10.5 на 2.11.7 и sbtVersion 1.13.9 также.

Текущий проект миграции — это Sales, в нем есть модули Sales-common, Sales-read, Sales-write. У него есть одно ядро зависимого проекта. Но у меня нет основного кода проекта, у меня есть только уже опубликованные банки артефактов (у меня есть myapp-core-read_2.10-2.2.33.jar 2.10 — это версия Scala).

Мой проект выглядит следующим образом

Продажи

 common

    build.sbt

read

    build.sbt

write

    build.sbt

build.sbt
  

До сих пор с scala 2.10.5 все работало нормально, используя и в режиме реального времени.

После изменения версии я запускаю sbt clean и sbt update . Я получаю нерешенную проблему зависимости, подобную этой:

 [warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: mycompany#myapp-core-read_2.11;2.2.33: not found
[warn]  :: mycomapny#myapp-core-write_2.11;2.2.33: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
  

Мой каталог продаж.sbt — это:

 name := "myapp-sales"

organization in ThisBuild := "com.mycompany"

scalaVersion in ThisBuild  := "2.11.7"

//crossScalaVersions in Thisq
//Build := List("2.10.5", scalaVersion.value)
//crossPaths := false

scalacOptions in Compile in ThisBuild   = Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-language:postfixOps", "-language:implicitConVersions")

lazy val common = Project("myapp-sales-common", file("common"))

lazy val read = Project("myapp-sales-read", file("read")).configs(IntegrationTest).settings(Defaults.itSettings: _*).dependsOn(common, write)

lazy val write = Project("myapp-sales-write", file("write")).configs(IntegrationTest).settings(Defaults.itSettings: _*).dependsOn(common)


conflictWarning in ThisBuild := ConflictWarning.disable

parallelExecution in Test in ThisBuild := false

parallelExecution in IntegrationTest in ThisBuild := false

javacOptions in Compile in ThisBuild   = Seq("-source", "1.6", "-target", "1.6")


//Remove SNAPSHOT check from the release process (for now until Squants gets a release)
releaseProcess := releaseProcess.value.filterNot(_ == ReleaseTransformations.checkSnapshotDependencies)
  

Мой модуль чтения build.sbt:

 libraryDependencies   = Seq(
  "com.mycompany"         %% "myapp-core-read"            % myappsales.CoreVersion            % "compile", // disable using the Scala version in output paths and artifacts,
  "com.mycompany"         %% "myapp-core-write"           % myappsales.CoreVersion            % "compile",
  "com.mycompany"         %% "myapp-registration-common"  % myappsales.RegistrationVersion    % "compile",
  "com.mycompany"         %% "myapp-load-common"          % myappsales.LoadVersion            % "compile",
  "com.mycompany"         %% "myapp-core-write-test"      % myappsales.CoreVersion            % "it, test",
  "com.mycompany"         %% "myapp-core-test"            % myappsales.CoreVersion            % "it, test"
)

libraryDependencies   = Seq(
  "com.typesafe"               % "config"                                % myappsales.TypeSafeConfigVersion % "compile",
  "org.json4s"                 %% "json4s-native"                         % Versions.Json4s         % "compile",
  "io.spray"                    % "spray-routing"                         % Versions.Spray          % "compile",
  "com.typesafe.akka"          %% "akka-actor"                            % Versions.Akka           % "compile",
  "com.typesafe.akka"          %% "akka-remote"                           % Versions.Akka           % "compile"
    exclude ("io.netty", "netty")
)

//Assemby settings
test in assembly := {}
assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("play.api.libs.iteratee.**" -> "shade.play.api.libs.iteratee.@1")
    .inLibrary("play" % "play-iteratees_2.10" % "2.1-RC2")
    .inLibrary("org.reactivemongo" % "reactivemongo_2.10" % "0.8.1-SNAPSHOT"),
  ShadeRule.rename("scala.concurrent.stm.**" -> "shade.scala.concurrent.stm.@1")
    .inLibrary("org.scala-stm" % "scala-stm_2.10.0" % "0.6")
    .inLibrary("play" % "play-iteratees_2.10" % "2.1-RC2")
)

assemblyMergeStrategy in assembly := {
  case "application.conf" => MergeStrategy.concat
  case path => MergeStrategy.defaultMergeStrategy(path)
}

//Make assembly a publishable artifact
artifact in (
  Compile, assembly) := {
  val art = (artifact in (Compile, assembly)).value
  art.copy(`classifier` = Some("assembly"))
}

addArtifact(artifact in (Compile, assembly), assembly)
  

Как я могу заставить это работать с существующими myapp-core-read_2.10-2.2.33.jar jar?

Ответ №1:

Важное примечание: Scala 2.10 и 2.11 несовместимы с двоичными файлами, поэтому вам придется перекомпилировать модули, от которых вы зависите

Ответ на вопрос:

Похоже, это связано с тем, как SBT разрешает зависимости. Когда вы объявляете зависимость, подобную такой:

 "com.mycompany" %% "myapp-core-read" % myappsales.CoreVersion  
  

%% Часть в объявлении означает, что SBT автоматически добавит версию scala к имени библиотеки, поэтому ваша зависимость становится

 group: com.mycompany
artifactId: myapp-core-read_2.11
version: `your version`
  

Похоже, что ваш файл myapp-core-read не был скомпилирован с помощью scala 2.11 , поэтому SBT не может найти правильную версию.

Вы можете избежать этого, используя % и применяя правильный суффикс вручную, чтобы ваша зависимость стала:

 "com.mycompany" % "myapp-core-read_2.10" % myappsales.CoreVersion
  

Сказав это, я думаю, что scala 2.10 и 2.11 несовместимы с двоичными файлами, поэтому вам, возможно, придется перекомпилировать myapp-core-read модуль с помощью 2.11.

Комментарии:

1. ВАУ, отличная информация, почти решила мою проблему. спасибо Денису Роске .

2. Я удалил одну, % но она не ищет «myapp-core-read_2.10» % myappsales. CoreVersion . он ищет «myapp-core-read» % myappsales. CoreVersion . Не могли бы вы, пожалуйста, помочь мне, как использовать существующие jar в локальном репозитории.

3. @Ravi Если вы удалите одну из них % , вам придется добавить суффикс самостоятельно. Итак, в объявлении зависимости вы должны изменить myapp-core-read на myapp-core-read_2.10 . В любом случае, как я сказал в ответе, вам, скорее всего, также придется перекомпилировать myapp-core-read с 2.11.