2016-10-21 3 views
0

Для моих существующих проектов я переношусь из scalaVersion 2.10.5 в 2.11.7 и sbtVersion 1.13.9.Как работают зависимости в Scala?

Текущий проект мигрирующего является продажами, он имеет Sales-общий, в продаже читаемого Sales-писать модулей. Он имеет один зависимый проект Core. Но у меня нет кода проекта Core. Я только что опубликовал артефактные баночки (у меня есть myapp-core-read_2.10-2.2.33.jar, 2.10 - версия Scala).

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

продаж

common 

    build.sbt 

read 

    build.sbt 

write 

    build.sbt 

build.sbt 

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

После изменения версии я запускаю 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] :::::::::::::::::::::::::::::::::::::::::::::: 

Мои Продажи buld.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.**" -> "[email protected]") 
    .inLibrary("play" % "play-iteratees_2.10" % "2.1-RC2") 
    .inLibrary("org.reactivemongo" % "reactivemongo_2.10" % "0.8.1-SNAPSHOT"), 
    ShadeRule.rename("scala.concurrent.stm.**" -> "[email protected]") 
    .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 j соток?

ответ

3

Важное примечание: 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.

+0

WOW, отличная информация, почти решена моя проблема. спасибо ** Денис Роска **. – Sun

+0

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

+0

@Ravi Если вы удалите один '%', вам нужно добавить суффикс самостоятельно. Поэтому в декларации зависимостей вам нужно изменить «myapp-core-read» на «myapp-core-read_2.10». В любом случае, как я уже сказал в ответ, вам, скорее всего, придется перекомпилировать myapp-core-read с помощью 2.11. –

Смежные вопросы