parboiled2 и Spray вызывают конфликт суффиксов кросс-версии

Я пытаюсь добавить parboiled2 в качестве зависимости к моему проекту и следую примеру калькулятора, но он конфликтует со спреем.

Мой текущий файл build.sbt включает в себя:

"io.spray" %% "spray-json" % "1.3.1" withSources() withJavadoc(),
"io.spray" %% "spray-can" % sprayV withSources() withJavadoc(),
"io.spray" %% "spray-routing" % sprayV withSources() withJavadoc(),
"io.spray" %% "spray-testkit" % sprayV  % "test" withSources() withJavadoc(),

Когда я добавляю

"org.parboiled" %% "parboiled" % "2.0.1" withSources() withJavadoc(),

я получил

[error] Modules were resolved with conflicting cross-version suffixes in {file:/blar/blar}blar-blar:
[error]    com.chuusai:shapeless _2.10.4, _2.10
[error]    org.scalamacros:quasiquotes _2.10, _2.10.3
java.lang.RuntimeException: Conflicting cross-version suffixes in: com.chuusai:shapeless, org.scalamacros:quasiquotes

Так же я погуглил, и, как обычно, люди предлагают использовать директиву exclude SBT (что, как мне кажется, не имеет логического смысла, поскольку неизбежно приведет к таким проблемам, как ClassNotFoundException и NoSuchMethodError). Я все же попробовал:

"org.parboiled" %% "parboiled" % "2.0.1" withSources() withJavadoc() 
  exclude("com.chuusai", "shapeless_2.10.4") exclude("org.scalamacros", "quasiquotes_2.10")

И сюрприз-сюрприз, когда я пытаюсь бежать assembly, я получаю

[error] java.lang.ClassNotFoundException: scala.quasiquotes.QuasiquoteCompat$

Я также получаю больше ошибок:

[error] bad symbolic reference
. A signature in RuleDSLBasics.class refers to term internal
[error] in package scala.reflect which is not available.
[error] It may be completely missing from the current classpath, or the version on
[error] the classpath might be incompatible with the version used when compiling RuleDSLBasics.class.
[error] error while loading RuleDSLBasics, Missing dependency 'bad symbolic reference. A signature in RuleDSLBasics.class refers to term annotations
[error] in value scala.reflect.internal which is not available.
[error] It may be completely missing from the current classpath, or the version on
[error] the classpath might be incompatible with the version used when compiling RuleDSLBasics.class.', required by ...

Если я закомментирую зависимости Spray (и код), я смогу успешно собрать банку с примером Calculator.

Это главная остановка для меня, использующая parboiled2. Есть ли способ, кроме директив exclude, заставить все это работать? У кого-нибудь есть рабочий файл сборки и с Spray, и с parboiled2? Если кому-то удалось обойти ад зависимостей с помощью onejar или ProGuard, я был бы рад, если бы они могли объяснить, как это сделать.

ОБНОВИТЬ:

Мой файл сборки:

resolvers ++= Seq(
  "Concurrent Maven Repo" at "http://conjars.org/repo",
  "spray repo" at "http://repo.spray.io"
)

val akkaV = "2.3.6"
val sprayV = "1.3.2"

libraryDependencies ++= Seq(
  "org.parboiled" %% "parboiled" % "2.0.1" withSources() withJavadoc(),
  // Causes org.scalamacros:quasiquotes _2.10, _2.10.3 cross-version problem
  "io.spray" %% "spray-testkit" % sprayV  % "test" withSources() withJavadoc(),
  // Causes com.chuusai:shapeless _2.10.4, _2.10 cross-version problem
  "io.spray" %% "spray-routing" % sprayV withSources() withJavadoc()
)

scalaVersion := "2.10.4"

javaOptions ++= Seq("-target", "1.8", "-source", "1.8")

organization := domain + "." + companyName

Файл плагинов:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

Скала 2.11

Кажется, что «просто» перенос 2.11 может решить эту проблему, но это не всегда так просто, если у вас есть другие библиотеки, которые не готовы к 2.11. Тем не менее, я попробовал это, и второй раз, когда я добавил parboiled2 в качестве зависимости, он снова сломал мою сборку, вздох, вот новая проблема: Parboiled2 вызывает обнаружение отсутствующей или недействительной зависимости при загрузке файла класса "Prepender.class"


person samthebest    schedule 26.12.2014    source источник


Ответы (2)


Тот же ответ, что и для Scala 2.11, должен работать и здесь: замените spray-routing на spray-routing-shapeless2.

person jrudolph    schedule 14.01.2015

Мне пришлось бы просмотреть весь файл build.sbt, чтобы понять, что происходит, но я могу без проблем использовать упомянутые вами зависимости с sbt 0.13.7 и scala 2.11.

Какая версия сбт? Какая версия Скала? 2.10 кажется. Почему? Вы застряли с этими версиями?

Для справки, вот файлы build.sbt, plugins.sbt и build.properties, которые я использовал для тестирования этого сценария.

https://gist.github.com/fedesilva/ddd28a5b592eb88f41ae

надеюсь, это поможет

person fedesilva    schedule 28.12.2014
comment
Хорошо, я попробую обновиться до 2.11. Я уже пробовал, но мои зависимости модульного тестирования сломались - оглядываясь назад, я, возможно, забыл сделать sbt clean. О результатах отпишусь... - person samthebest; 29.12.2014
comment
Поэтому, когда я пытаюсь обновиться до 2.11, я получаю [error] Modules were resolved with conflicting cross-version suffixes in ... org.specs2:specs2 _2.10, _2.11. У меня сейчас такая же версия sbt-assembly, как у вас. ("org.specs2" % "specs2_2.10" % "1.14") - person samthebest; 02.01.2015
comment
С 2.10 у меня все еще возникает проблема с кросс-версией, я обновлю OP, чтобы более конкретно указать мой файл сборки ... - person samthebest; 02.01.2015