运行“play”时出现java.lang.NoSuchMethodError错误

7
我正在尝试运行从git克隆的play项目副本,地址为https://github.com/djonmayer/play21-osm.git。我已经安装了play版本2.2.2和scala版本2.10.4。
当我在克隆的目录中键入play时,会出现以下错误:
java.lang.NoSuchMethodError: scala.Predef$.augmentString(Ljava/lang/String;)Lscala/collection/immutable/StringOps;
    at sbt.ConsoleLogger$.<init>(ConsoleLogger.scala:129)
    at sbt.ConsoleLogger$.<clinit>(ConsoleLogger.scala)
    at sbt.StandardMain$.<init>(Main.scala:52)
    at sbt.StandardMain$.<clinit>(Main.scala)
    at sbt.xMain.run(Main.scala:26)
    at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:57)
    at xsbt.boot.Launch$.withContextLoader(Launch.scala:77)
    at xsbt.boot.Launch$.run(Launch.scala:57)
    at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
    at xsbt.boot.Launch$.launch(Launch.scala:65)
    at xsbt.boot.Launch$.apply(Launch.scala:16)
    at xsbt.boot.Boot$.runImpl(Boot.scala:32)
    at xsbt.boot.Boot$.main(Boot.scala:21)
    at xsbt.boot.Boot.main(Boot.scala)
Error during sbt execution: java.lang.NoSuchMethodError: scala.Predef$.augmentString(Ljava/lang/String;)Lscala/collection/immutable/StringOps;

如果我运行play clean,那么这是正确的。我读过这可能是一个依赖性问题,所以我尝试在Build.scala的play.Project.settings部分和单独在build.sbt文件中添加了scalaVersion := "2.10.4"这一行代码。但是它没有起作用。


我在尝试在某些应用程序中首次运行sbt时遇到了这个问题,即sbt版本与我的安装版本不同,我从我的主目录中删除了.sbt目录,然后运行sbt,它可以正确地工作。 - Majid Hosseini
2个回答

8

我试图将这个内容放在评论里,但是无法阅读。

感谢zeppaman。看起来这个问题与运行一个在旧版本Play中创建的Play框架项目有关。通过查看另一个升级到新Play版本的项目的提交,我做出了以下更改。

在build.properties中:

sbt.version=0.12.2

变成了:

sbt.version=0.13.0

在plugins.sbt文件中:

addSbtPlugin("play" % "sbt-plugin" % "2.1.1")

成为:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2")

这使我能够进行更新,但随后出现错误:
[error] Modules were resolved with conflicting cross-version suffixes in {file:/Users/michaelrichardson/Documents/Play/play21-osm/}play21-osm:
[error]    org.scala-stm:scala-stm _2.10, _2.10.0
[trace] Stack trace suppressed: run last *:update for the full output.
[error] (*:update) Conflicting cross-version suffixes in: org.scala-stm:scala-stm

我修改了Build.scala文件中的一行:

    "com.typesafe.play" %% "play-slick" % "0.3.2"

成为:
    "com.typesafe.play" %% "play-slick" % "0.5.0.2-SNAPSHOT"

额外信息:这会改变错误为:
[info] Resolving com.typesafe.play#play-slick_2.10;0.5.0.2-SNAPSHOT ...
[warn]  module not found: com.typesafe.play#play-slick_2.10;0.5.0.2-SNAPSHOT
[warn] ==== Typesafe Releases Repository: tried
[warn]   http://repo.typesafe.com/typesafe/releases/com/typesafe/play/play-slick_2.10/0.5.0.2-SNAPSHOT/play-slick_2.10-0.5.0.2-SNAPSHOT.pom
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.typesafe.play#play-slick_2.10;0.5.0.2-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[trace] Stack trace suppressed: run last *:update for the full output.
[error] (*:update) sbt.ResolveException: unresolved dependency: com.typesafe.play#play-slick_2.10;0.5.0.2-SNAPSHOT: not found

更新:已解决未解决的依赖关系

未解决的依赖关系问题似乎可能是由于我的本地sbt/ivy存储库损坏所致。请参见unresolved dependency: com.typesafe.play#play-slick_2.10;0.6.0.1: not found


play-slick在它正在搜索的位置中不存在http://repo.typesafe.com/typesafe/releases/com/typesafe/play/。有人知道它应该在哪里搜索play-slick吗? - Michael Richardson
谢谢提供信息。Play框架似乎太过错误。版本的脆弱性让我感到困扰。 - Jus12

1
这种问题通常与两个类似的问题有关:
  • 缺少具有相同类的jar包
  • 将相同的类放入多个jar包中
因此,请检查Scala和Play的版本是否兼容,并检查是否已经包含了一个包含缺失方法的类的jar包。

为了实现这一点,如果还没有完成,请尝试使用原始版本运行项目。一旦确定了,您可以尝试将其移植到新的框架版本。 - zeppaman
我也搜索了类似的问题,但只找到了这个网址http://stackoverflow.com/q/20644948/3559251,其中@La-comadreja通过在类路径上管理类进行解决 - zeppaman
我看过那个线程,但是我不理解答案中需要我做什么,“解决方案是将相关类放入类路径中。” - Michael Richardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接