Play Framework和scala.tools.nsc

时间:2012-05-17 19:13:57

标签: scala sbt playframework-2.0

我必须在Play Framework应用程序中使用scala解析器。

import scala.tools.nsc._

trait Foo
class Parser {
    def parse(code: String) = {
        val settings = new Settings
        settings.embeddedDefaults[Foo]
        val interpreter = new Interpreter(settings)
        interpreter.parse(code)
    }
}

我在Build.scala中有以下依赖

"org.scala-lang" % "scala-compiler" % "2.9.1"

此代码在使用SBT构建时有效。在Play中,它以NullPointerException结束,并且:

  

无法初始化编译器:找不到对象标量。

     

**请注意,从2.8开始,scala不会假设使用java类路径。

     

**对于旧行为,将-usejavacp传递给scala,或者使用设置

     

** object以编程方式,settings.usejavacp.value = true。

Build.scala

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "com.qwerty.utils"
    val appVersion      = "1.0-SNAPSHOT"
    val scalaVersion    = "2.9.1"

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

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here

    )

}

1 个答案:

答案 0 :(得分:1)

有关embeddedDefaults的背景信息,请参阅original proposal

容器(Play)必须定义'app.class.path'和'boot.class.path'资源,然后embeddedDefaults将使用它们为环境正确配置解释器。所以,这是Play的增强功能。

如果您可以将必要的类路径传递到您的应用程序中,您可以使用以下内容自行配置类路径和类加载器:

val settings = new Settings
settings.classpath.value = "<classpath>"
settings.bootclasspath.value =
  settings.bootclasspath.value + File.pathSeparator +
  "<extra-bootclasspath>"
val interpreter = new Interpreter(settings) {
    override def parentClassLoader = classOf[Foo].getClassLoader
}
interpreter.parse(code)

bootclasspath通常应包含scala-library.jar,类路径应包含应用程序jar。