2012-05-17 6 views
2

Мне нужно использовать парсер scala внутри приложения Play Framework.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. В Play он заканчивается с NullPointerException и:

Не удалось инициализировать компилятор: объект scala не найден.

** Обратите внимание, что с 2.8 scala не предполагает использование класса javapathpath.

** Для старого поведения передать -usejavacp к Скале, или если с помощью настройки

** объект программно, settings.usejavacp.value = истина.

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 

    ) 

} 
+0

Вы отметили его как зависимость от библиотеки или зависимость уровня сборки? В любом случае, вы можете добавить свой файл Build.scala в вопрос. –

+0

На какой линии вы получаете NPE? – opyate

+0

Также, как вы используете свое приложение? – opyate

ответ

1

Для фона на embeddedDefaults см original proposal.

Контейнер (Play) должен определять ресурсы «app.class.path» и «boot.class.path», а затем embeddedDefaults будет использовать их для правильной настройки интерпретатора для среды. Таким образом, это улучшает игру.

Если вы можете пройти необходимые пути к классам в приложение, вы можете настроить и пути к классам загрузчики классов явно себя что-то вроде:

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) 

должны, как правило загрузочного пути к классам содержать SCALA-library.jar и классам должен содержать приложений.