【问题标题】:Play 2.3 run error玩2.3运行报错
【发布时间】:2014-08-03 11:23:07
【问题描述】:

我在运行最新的播放框架 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。 知道这是为什么吗?

有什么想法吗?

【问题讨论】:

  • 您正在使用 Play 提供的 ws 依赖项,但您正在分别导入 JDBC 和 JSON 库。这是为什么呢?
  • 那是一个不需要全部play的子项目。
  • 这似乎相关:stackoverflow.com/questions/13098856/…。如果在更多地方添加scalaVersion 会怎样?
  • 我在每个 build.sbt 文件中都明确尝试了 scalaVersion,结果完全一样。
  • DCKing 我刚刚添加了下载日志,您知道这是为什么吗?

标签: scala playframework playframework-2.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

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

我们可以创建一个包含Seq[Setting[_]]lazy val,并使用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 的输出是:

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

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

【讨论】:

  • 按照您的示例 build.sbt,一个子项目是:lazy val precog = project.in(file("components/precog")).dependsOn(frameworkDependency, dependencyBuilder).aggregate(framework , dependencyBuilder) 请注意,这里定义了 no 设置。除非您也将其添加到项目中,否则导入 Commons._ 并没有帮助,例如lazy val precog = project.in(file("components/precog")).dependsOn(frameworkDependency, dependencyBuilder).aggregate(framework, dependencyBuilder).settings(appSettings: _*) 即这里的主要区别是显式添加appSettings项目通过 settings() 方法。
  • 问题中提到的build.sbt的副本是否过期?因为如果我获取您提供的文件,我可以看到某些项目的 scalaVersion 为“2.10.4”。如果我做出建议的更改,所有项目的 scalaVersion 都是“2.11.1”。导入您提供的 Commons.scala 文件不会自动将这些设置应用于子项目。它只会将它们应用于根项目。
  • 你能从 sbt 运行“show scalaVersion”吗?这将显示您的项目所期望的 scala 版本。所有行都应该显示“2.11.1”,或者该项目没有选择您的设置。 (我没有足够的声望使用聊天界面)。
  • 好的,那么至少我们知道版本设置是有效的。另外,当 libraryDependency 引入旧版本的 scala-library 时,我之前也看到过类似的问题。尝试“show libraryDependencies”看看是否包含任何 _2.10 库? “scala-library:2.10.4”在列表中将是一件特别糟糕的事情。
  • 啊。你可以试试github.com/jrudolph/sbt-dependency-graph - 然后运行“dependencyTree”。给出这种事情可能导致问题的原因:我看到了一个问题,即 scala 2.9 构建引入了 akka 2.x,它本身可传递地依赖于 scala-library 2.10。结果是查找基本 scala 类(选项)时出错。
【解决方案2】:

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

使用 SBT 时,请勿使用:

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

改为使用:

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

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

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

scalaVersion := "2.11.1"

【讨论】:

  • 这也不是问题,我试过强迫它。但无论哪种方式,都会发生同样的情况。注意:使用该信息更新了初始帖子。
  • @rtfpessoa 我认为您应该发布完整的构建文件。现在没有足够的信息来解决问题。
  • 构建文件是什么意思?
  • @rtfpessoa build.sbtBuild.scala 文件,无论您用于构建和运行应用程序。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多