9

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

我正在尝试在 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)
  }
}

一旦通过 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.

构建.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(    
  )
}

到目前为止我尝试过的

这一切都没有奏效:

我不知道现在该怎么办。

4

2 回答 2

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")

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

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

于 2013-05-12T23:48:35.670 回答
-1

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

"org.scala-lang" % "scala-reflect" % "2.10.0"
于 2013-05-13T00:03:51.107 回答