Я пытаюсь добавить 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"