Play 2.1中的scala.tools.nsc.IMain

Mar*_*ing 9 scala classpath read-eval-print-loop playframework-2.0

我google了很多,现在完全陷入困境.我知道,有类似的问题,但请读到最后.我已经尝试了所有提出的解决方

我试图在Play 2.1项目中使用IMain该类scala.tools.nsc(使用Scala 2.10.0).

控制器代码

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

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

只要通过Websocket发送了一些内容,就会发现以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

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(    
  )
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的

这一切都行不通:

我现在不知道该怎么做.

小智 3

这里的问题是 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")
Run Code Online (Sandbox Code Playgroud)

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

编辑链接到演示上述内容的示例项目。`