2

PlayFrameworkアプリケーション内で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に渡すか、設定を使用している場合

**プログラムでオブジェクト、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
    
    )

}
4

1 に答える 1

1

の背景については、元の提案embeddedDefaultsを参照してください。

コンテナー(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が含まれ、classpathにはアプリケーションjarが含まれている必要があります。

于 2012-06-10T20:47:04.483 に答える