2012-05-17 126 views
2

我必須在Play Framework應用程序中使用scala分析器。Play Framework和scala.tools.nsc

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構建時,此代碼以下的依賴。在播放它結束與NullPointerException和:

未能初始化編譯器:找不到對象scala。

**請注意,2.8 scala並不假定使用java classpath。

**對於舊的行爲通過-usejavacp到階,或者如果使用一個設置

**對象編程,settings.usejavacp.value =真。

embeddedDefaultsBuild.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 

    ) 

} 
+0

您是否將其標記爲庫依賴項或生成級依賴項?無論如何,你可能想要將你的Build.scala文件添加到問題中。 –

+0

您在哪一行獲得NPE? – opyate

+0

另外,你是如何運行你的應用程序? – opyate

回答

1

有關背景,看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) 

的引導類路徑一般應包括斯卡拉 - library.jar和類路徑應該包含應用程序罐。