播放2.3运行错误

时间:2014-06-13 00:57:13

标签: scala playframework playframework-2.3

我在运行最新的游戏框架2.3时遇到了问题。 它编译得很好,但是当我activator run时会发生这个错误:

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

Full error log

我在每个build.sbt文件中明确尝试过scalaVersion,它们是相同的。 我尝试了几个像activator clean,完全删除os sbt缓存和本地repo sbt的东西,更新了最新版本的依赖,但没有成功。 我定义了scala版本。

我目前的依赖关系是: 我尝试使用%%和强制_2.11作为依赖项的名称。

Dependency List

其他重要文件

build.sbt

Common.scala

Dependencies.scala

当我完全清理缓存时,它会毫无理由地下载scala 2.10.4: 在这个download log它说sbt需要旧的scala。 知道为什么会这样吗?

有什么想法吗?

3 个答案:

答案 0 :(得分: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的{​​{1}},并使用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[_]]会在两种类型之间进行转换。另见:What does param: _* mean in Scala?

sbt的输出是:

_*

这种方法可以轻松应用于您的构建。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

使用SBT时,请勿使用:

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

改为使用:

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

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

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

scalaVersion := "2.11.1"