scala.reflect.internal.FatalError:包scala没有成员Int

dim*_*ima 8 interpreter scala playframework

我目前正在使用Scala和Play Framework 2开发一个项目.我想在运行时编译一些Scala代码,并从解释器中获取结果.我在互联网上找到了一些例子,最后提出了以下代码:

package controllers

import play.api.mvc.{Action, Controller}
import javax.script.ScriptEngineManager

class Interpreter extends Controller {

    val interpreter = new ScriptEngineManager().getEngineByName("scala")
    val settings = interpreter.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
    settings.embeddedDefaults[Interpreter]
    settings.usejavacp.value = true

    def index = Action {
        Ok(views.html.interpreter())
    }

    def interpret(input: String) = Action { 
        implicit request => interpreter.eval("1 to 10 foreach println")
        Ok("Got: " + input)
    }
}

object Interpreter
Run Code Online (Sandbox Code Playgroud)

我的问题是scala.reflect.internal.FatalError: "package scala does not have a member Int",在尝试运行此代码时,我总是会收到错误.经过一些研究,我发现这篇文章中描述了类似的问题:

Scala和Play 2.0插件更新0.38.437已经完成

Scala编译器错误:包api没有成员materializeWeakTypeTag

我当前的Scala版本是2.11.4,所以我尝试在我的"build.sbt"文件中切换到不同的"scala-compiler"和"scala-library"版本,但没有成功.就像上面的帖子中提到的那样,它可能是Scala中的一个错误.我想知道是否有人为所述问题提供解决方案或任何解决方法.

提前感谢您的任何帮助或建议.

小智 3

该问题出现在使用 Scala 和 Play Framework 2 的项目中的类路径中。可以通过将类路径从 SBT 填充到应用程序来解决:

添加到 build.sbt 文件:

val sbtcp = taskKey[Unit]("sbt-classpath")

sbtcp := {
  val files: Seq[File] = (fullClasspath in Compile).value.files
  val sbtClasspath : String = files.map(x => x.getAbsolutePath).mkString(":")
  println("Set SBT classpath to 'sbt-classpath' environment variable")
  System.setProperty("sbt-classpath", sbtClasspath)
}

compile  <<= (compile in Compile).dependsOn(sbtcp)
Run Code Online (Sandbox Code Playgroud)

代码:

package controllers

import play.api.mvc.{Action, Controller}
import javax.script.ScriptEngineManager

class Interpreter extends Controller {

    val interpreter = new ScriptEngineManager().getEngineByName("scala")
    val settings = interpreter.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
    //settings.embeddedDefaults[Interpreter] // not need
    //settings.usejavacp.value = true // not need
    val sbtClasspath = System.getProperty("sbt-classpath")
    settings.classpath.value = s".:${sbtClasspath}" // <-- this line fix the problem

    def index = Action {
        Ok(views.html.interpreter())
    }

    def interpret(input: String) = Action { 
        implicit request => interpreter.eval("1 to 10 foreach println")
        Ok("Got: " + input)
    }
}

object Interpreter
Run Code Online (Sandbox Code Playgroud)

在生产中应该使用另一个场景来获取正确的类路径。

可能在命令行中使用“-cp”或“-classpath”键。