parboiled2和Spray会导致冲突的跨版本后缀

时间:2014-12-26 14:42:24

标签: scala sbt spray sbt-assembly parboiled

我正在尝试将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

谷歌搜索也是如此,像往常一样,人们建议使用SBT的exclude指令(我不相信它具有逻辑意义,因为它不可避免地会导致ClassNotFoundException和{{1}等问题}})。不过我试过了:

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$

如果我注释掉Spray依赖项(和代码),我可以使用Calculator示例成功组装jar。

这是使用parboiled2的主要显示器。除了[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和parboiled2的工作构建文件?如果有人设法通过onejar或ProGuard来解决依赖地狱问题我会喜欢它,如果他们可以解释如何。

更新:

我的构建文件:

exclude

插件文件:

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

Scala 2.11

似乎“简单地”移动2.11可能会解决这个问题,但如果有一些其他库已经没有准备就绪,那么这并不总是那么容易。然而我尝试了,第二次我添加了parboiled2作为依赖它再次破坏了我的构建,感叹,这是新问题:Parboiled2 causes "missing or invalid dependency detected while loading class file 'Prepender.class'"

2 个答案:

答案 0 :(得分:2)

同样的answer as for Scala 2.11也适用于此:将spray-routing替换为spray-routing-shapeless2

答案 1 :(得分:0)

我必须查看整个build.sbt文件以了解发生了什么,但我可以使用你提到的依赖关系而没有问题sbt 0.13.7和scala 2.11。

什么版本的?什么Scala版本? 2.10似乎。为什么?你坚持使用那些版本吗?

作为参考,这里是我用来测试这个场景的build.sbt,plugins.sbt和build.properties文件。

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

希望有所帮助