0

我在运行最新的播放框架 2.3 时遇到问题。它编译得很好,尽管当我这样做时activator run会发生此错误:

java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;

完整的错误日志

我在每个 build.sbt 文件中都明确地尝试了 scalaVersion,它是一样的。我尝试了几件事activator clean,例如完全删除 os sbt 缓存和本地 repo sbt 东西,将依赖项更新到最新版本但没有成功。我已经定义了 scala 版本。

我当前的依赖项是:我尝试以依赖项的名义同时使用%%和强制_2.11

依赖列表

其他重要文件

构建.sbt

Common.scala

依赖项.scala

当我完全清理缓存时,它会无缘无故地下载 scala 2.10.4:在这个下载日志中,它说 sbt 需要旧的 scala。知道这是为什么吗?

有任何想法吗?

4

3 回答 3

1

首先,使用哪个版本的 Scala 来生成构建并不重要。构建系统可以使用 2.10.4 版本,这不会阻止您的代码使用 2.11.1 版本。

要查看您的 scala 版本的问题,您应该考虑将直接添加的设置添加build.sbt到根项目中,而不是添加到其他项目中。您可以通过一个最小的项目看到这一点,例如:

$ cat build.sbt
scalaVersion := "2.11.1"

lazy val subproj = project in (file("subproj"))

那么 sbt 的输出是这样的:

> show scalaVersion
[info] subproj/*:scalaVersion
[info]  2.10.4
[info] sbttest/*:scalaVersion
[info]  2.11.1

那么,如何解决这个问题?

我们可以创建一个lazy val包含 a 的Seq[Setting[_]],并使用该方法将其添加到子项目定义中settings()

build.sbt这是一个为所有项目添加相同设置的示例:

$ cat build.sbt
lazy val root = project.in(file("."))
  .aggregate(subproj)
  .dependsOn(subproj)
  .settings(commonSettings: _*)

lazy val subproj = project.in(file("subproj"))
  .settings(commonSettings: _*)

lazy val commonSettings = Seq(
  scalaVersion := "2.11.1"
)

_*是必需的,因为settings()被定义为要求Setting[_]*而不是Seq[Setting[_]],所以_*在两种类型之间进行转换。另请参阅:param: _* 在 Scala 中是什么意思?

sbt 的输出是:

> show scalaVersion
[info] subproj/*:scalaVersion
[info]  2.11.1
[info] root/*:scalaVersion
[info]  2.11.1

这种方法可以很容易地应用于您的构建。

于 2014-06-14T17:20:48.787 回答
0

该问题与我在 lib 文件夹中发现的一些手动添加的 jar 有关,这些 jar 导致 build.sbt 中定义的项目的依赖项出现问题。找出的唯一方法是生成一个activator dist并查找具有不同版本的类似依赖项,因为在依赖关系图中没有冲突

于 2014-06-13T02:14:11.497 回答
0

您以错误的方式定义依赖项。

使用 SBT 时,请勿使用:

"org.mydep" % "mydep_2.11" % "1.0.0"

而是使用:

"org.mydep" %% "mydep" % "1.0.0"

%%运算符自动附加当前构建的当前Scala 版本。如果您使用针对其他 Scala 版本构建的依赖项,您将遇到奇怪的错误。

还要确保您在某处明确指定您的 Scala 版本:

scalaVersion := "2.11.1"
于 2014-06-13T11:05:10.183 回答