我目前正在使用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
我的问题是,在尝试运行此代码时,我总是从scala.reflect.internal.FatalError: "package scala does not have a member Int"
收到错误。经过一些研究,我发现这篇文章中描述了类似的问题:
Scala and Play 2.0 Plugins Update 0.38.437 is Out
Scala compiler error: package api does not have a member materializeWeakTypeTag
我当前的Scala版本是 2.11.4 ,所以我尝试切换到另一个" scala-compiler"和" scala-library"我的" build.sbt"中的版本文件,但没有成功。就像上面的帖子中提到的那样,它可能是Scala中的一个错误。我想知道是否有人为所述问题找到解决方案或任何解决方法。
提前感谢您的任何帮助或建议。
答案 0 :(得分:3)
问题出在使用Scala和Play Framework 2的项目的classpath中。 可以通过将类路径从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)
代码:
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
在生产中应该使用另一种方案来获得正确的类路径。
可能在命令行中使用'-cp'或'-classpath'键。
答案 1 :(得分:0)
我通过指定scala-maven-plugin
我使用的是Scala 2.11.x
,如果默认情况下您未在scala-maven-plugin
中指定任何版本,则它将使用4.4.0
的最新版本
然后我将scala-maven-plugin
更改为3.2.2,它可以正常工作。