【问题标题】:scala.tools.nsc.IMain within Play 2.1Play 2.1 中的 scala.tools.nsc.IMain
【发布时间】:2013-05-06 20:21:36
【问题描述】:

我用谷歌搜索了很多,现在完全卡住了。我知道,有类似的问题,但请阅读到最后。我已经尝试了所有建议的解决方案,但都没有奏效。

我正在尝试在 Play 2.1 项目中使用来自 scala.tools.nscIMain 类(使用 Scala 2.10.0)。

控制器代码

这是代码,我尝试在 Websocket 中使用IMain。这仅用于测试。

object Scala extends Controller {
  def session = WebSocket.using[String] { request =>
    val interpreter = new IMain() 
    val (out,channel) = Concurrent.broadcast[String]
    val in = Iteratee.foreach[String]{ code =>
      interpreter.interpret(code) match {
        case Results.Error =>      channel.push("error")
        case Results.Incomplete => channel.push("incomplete")
        case Results.Success =>    channel.push("success")
      }      
    } 
    (in,out)
  }
}

一旦通过 Websocket 发送某些内容,play 就会记录以下错误:

Failed to initialize compiler: object scala.runtime in compiler mirror not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programatically, settings.usejavacp.value = true.

Build.scala

object ApplicationBuild extends Build {
  val appName         = "escalator"
  val appVersion      = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    "org.scala-lang" % "scala-compiler" % "2.10.0"
  )

  val main = play.Project(appName, appVersion, appDependencies).settings(    
  )
}

到目前为止我所尝试的

这一切都不起作用:

我现在不知道该怎么办。

【问题讨论】:

  • 你有没有尝试过更简单的方法,比如 (new scala.tools.nsc.interpreter.IMain()).interpret("val x = 1") match ...
  • @Iraklis 是的。我把它放在 Global.scala 的初始化代码中。同样的错误信息。
  • 您可能还想看看我对这个问题的回答here

标签: scala playframework-2.0 classpath read-eval-print-loop


【解决方案1】:

这里的问题是 sbt 没有将 scala-library 添加到类路径中。 以下解决方法有效。 首先在顶层项目目录(app、conf 等的父目录)中创建一个文件夹 lib 并将 scala-library.jar 复制到那里

然后您可以使用以下代码来托管解释器:

      val settings = new Settings
      settings.bootclasspath.value +=scala.tools.util.PathResolver.Environment.javaBootClassPath + File.pathSeparator + "lib/scala-library.jar"
      val in = new IMain(settings){
            override protected def parentClassLoader = settings.getClass.getClassLoader()
      }
     val res = in.interpret("val x = 1")

上面通过将 scala 库添加到 java 类来创建引导类路径。来自 sbt 的 play 框架不是问题。任何使用 sbt 运行的 scala 项目都会出现同样的问题。用一个简单的项目进行了测试。当它从 Eclipse 运行时,它工作正常。

编辑Link to sample project demonstrating the above.`

【讨论】:

  • 对我不起作用。现在错误消息从scala.runtime 更改为scala.annotation.Annotation...但仍然是同样的问题。
  • 您可能没有复制正确的 scala-library.jar。如果你想要我不能把我用过的项目发给你。
  • 我使用了 2.10.0 scala 库。那将是真棒。您可以在我的个人资料中找到我的邮件地址。
  • 非常感谢您的努力!我现在就去看看。 :)
  • 你的操作系统是什么?也许尝试以下而不是“:”写 File.pathSeperator
【解决方案2】:

我想知道反射罐是否丢失。尝试在 appDependencies 中也添加它。

"org.scala-lang" % "scala-reflect" % "2.10.0"

【讨论】:

  • 不幸的是,这没有帮助... :(
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多