Play Framework 和 scala.tools.nsc
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日
有关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。