Play Framework 和 scala.tools.nsc

13 浏览
0 Comments

Play Framework 和 scala.tools.nsc

我必须在Play框架应用程序中使用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结束,并显示以下错误消息:

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

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

** 如果要继续使用旧的行为,请传递-usejavacp给scala,或者如果使用Setttings

** 对象编程,则设置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
    )
}

admin 更改状态以发布 2023年5月22日
0
0 Comments

有关embeddedDefaults的背景,请参见原始建议

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

如果您可以将必要的类路径传递到应用程序中,您可以通过类似以下的东西显式地配置类路径和类加载器:

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

bootclasspath通常应包含scala-library.jar,而classpath应包含应用程序jar。

0