scala - 为什么在一种环境下而不在另一种环境下sbt的交叉版本冲突?

标签 scala sbt sorm

我有一个具有以下依赖项的sbt项目:

libraryDependencies ++= Seq(
  "org.scalatra"           %% "scalatra"          % ScalatraVersion,
  "org.scalatra"           %% "scalatra-scalate"  % ScalatraVersion,
  "org.scalatra"           %% "scalatra-specs2"   % ScalatraVersion   % "test",
  "ch.qos.logback"         %  "logback-classic"   % "1.1.2"           % "runtime",
  "org.eclipse.jetty"      %  "jetty-webapp"      % "9.1.5.v20140505" % "container",
  "org.eclipse.jetty"      %  "jetty-plus"        % "9.1.5.v20140505" % "container",
  "javax.servlet"          %  "javax.servlet-api" % "3.1.0",
  "org.sorm-framework"     %  "sorm"              % "0.3.18",
  "com.h2database"         %  "h2"                % "1.4.187",
  "org.fusesource.scalamd" %  "scalamd_2.10"      % "1.6"
)

在一台机器上,我可以毫无问题地运行./sbt;另一方面,我得到
[error] Modules were resolved with conflicting cross-version suffixes in {file:/C:/dev/scalaspace/game-tracker/}game-tracker:
[error]    org.scala-lang.modules:scala-xml _2.11, _2.12.0-M1
[error]    org.scala-lang.modules:scala-parser-combinators _2.11, _2.12.0-M1

我已经隔离了问题和解决方法。 Sorm取决于2.12.0-M1编译器:
[info]   +-org.sorm-framework:sorm:0.3.18 [S]
[info]     +-com.github.nikita-volkov:embrace:0.1.4 [S]
[info]     | +-org.scala-lang:scala-compiler:2.12.0-M1 [S]
[info]     |   +-org.scala-lang.modules:scala-parser-combinators_2.12.0-M1:1.0.4 [S]
[info]     |   +-org.scala-lang.modules:scala-xml_2.12.0-M1:1.0.4 [S]
[info]     |   +-org.scala-lang:scala-reflect:2.11.0 [S] (evicted by: 2.11.6)
[info]     |   +-org.scala-lang:scala-reflect:2.11.6 [S]
[info]     |   +-org.scala-lang:scala-reflect:2.12.0-M1 (evicted by: 2.11.0)

通过将exclude("org.scala-lang","scala-compiler")添加到sorm依赖项中,可以使项目在两个位置都可以构建。但是为什么行为不一致?两种环境都使用相同版本的sbt(0.13.8)和scala(2.11.6)。有什么不同?

最佳答案

给定com.github.nikita-volkov:embrace的pom,我猜这是由于使用了结合了缓存的版本范围:

<dependency>
  <groupId>org.scala-lang</groupId>
  <artifactId>scala-compiler</artifactId>
  <version>[2.10,3)</version>
  <scope>compile</scope>
</dependency>

特别是鉴于Scala 2.12.0-M1已于昨天发布:
  • http://www.scala-lang.org/news/2.12.0-M1


  • 要解决不一致问题,您要清除 Ivy 缓存:
    rm -r ~/.ivy2/cache
    

    但是,您还想修复scala-compiler使用的版本,并且希望它与您配置的scalaVersion匹配:
    dependencyOverrides += "org.scala-lang" % "scala-compiler" % scalaVersion.value
    

    在“库管理”文档的Overriding a version部分中查看更多详细信息。

    关于scala - 为什么在一种环境下而不在另一种环境下sbt的交叉版本冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088274/

    相关文章:

    scala - 是否有必要在新的 scala 项目中添加我的自定义 scala 库依赖项?

    java - 将 avro 集成到 sbt 工作流程中

    database - 如何在 SORM 中设置数据库连接超时?

    scala - 将SORM与Play Framework 2.3.8结合使用

    generics - 扩展 Scala 集合

    linux - 如何对多个 csv 文件(Linux 或 Scala)进行完全外部联接?

    scala 在操作元素时调用 mkString

    java - Scala 和 SparkJava,如何使用 lambda 表达式

    scala - SBT/Scala 和集成测试

    scala - SORM中的SQLite支持?