1

コンパイル中に (Rhino 経由で) コンパイルした Javascript クラスをどこに配置すればよいですか? コンパイル中にクラスパスに含め、生成された distバンドルに含めますか?

Play Framework 2.1-RC1 + SBT は、コンパイル中や dist バンドルの生成中に、それらを無視します。

1. 生成されたファイルをclasses/またはに配置するclasses_managed/

生成された .class ファイルをここまたはここに配置すると:
target/scala-2.10/classes/ target/scala-2.10/classes_managed/

その後compile、正常にrun動作します。stageしかし、途中でいくつかの奇妙なコンパイル手順 (何?!)distが失敗します。コンパイルされたクラスが見つかりません。

2. クラスを専用ディレクトリに配置する

生成された .class ファイルをここに配置すると: target/scala-2.10/compiledjs-classes/

そして、クラスパス エントリを SBT の構成に追加します。

object ApplicationBuild extends Build {
  ...
  def mainSettings = List(
    ...,
    unmanagedClasspath in Compile <+= (baseDirectory) map { bd =>
      Attributed.blank(bd / "target/scala-2.10/compiledjs-classes")
    },
    ...)

次に、、、compileおよび正常にrun動作します。でも!生成された .zip ファイル (.zip で生成) を解凍して起動すると、コンパイルされた Javascript クラスが .zip に含まれていないため、実行時にアプリケーションが失敗します。stagedistdist

3. lib/ フォルダーにクラスを配置する

その後compile、クラスファイルが見つかりません。(eg class を に配置compiledjs.HtmlSanitizerJsしました lib/compiledjs/HtmlSanitizerJs.class。)


私はどうしたらいいですか?つまり、何が機能し、ベストプラクティスとは何ですか?

とにかく、現在、生成されたクラスを両方にコピーしています (
target/scala-2.10/compiledjs-classes/コンパイルが機能するため) と
target/scala-2.10/classes/(生成された .zip に含まれているため)
これは機能しますが、非常に間違っているように感じます。

(( 奇妙なことに、古いバージョンの Play フレームワーク (RC-1 よりも古い)、play.Project ではなく PlayProject を使用していた場合、すべてが正常に機能しました。その後、生成されたクラスをtarget/scala-2.10/classes/, のみに保持しました。))

4

1 に答える 1

1

ステージ タスクでクラスファイルを jar に配置する方法が見つかりませんでした。回避策として、ステージ上で JAR ファイルを生成し、実行時にクラスパスをベース フォルダーの "rhino" フォルダーに設定します。

https://gist.github.com/4321216 rhino /so/Example.class は Rhino クラスを表しますが、文字列を返す Java クラスにすぎません。

Build.scala に追加します。

  val rhinoJarName = "rhino.jar"
  val folderForRhinoJar = unmanagedBase
  val rhinoClasspath = (baseDirectory) map { base => Attributed.blank(base / "rhino")}
  val rhinoClassesToJar = TaskKey[Unit]("rhino-classes-to-jar")
  val rhinoClassesToJarInitializer = (base: File, folderForJar: File) => {
    val rhinoFolder = new File(base, "rhino")
    val isClassFile = (file: File) => file.getName.endsWith("class")
    val classFiles =  rhinoFolder.***.filter(isClassFile).get
    val sources = classFiles map { file =>
      file -> file.getCanonicalPath.drop(rhinoFolder.getCanonicalPath.length + 1)
    }
    IO.jar(sources, folderForJar / rhinoJarName, new java.util.jar.Manifest())
  }

  val main = play.Project(appName, appVersion, appDependencies).settings(
    unmanagedClasspath in Compile <+= rhinoClasspath,
    unmanagedClasspath in Runtime <+= rhinoClasspath,
    rhinoClassesToJar <<= (baseDirectory, folderForRhinoJar) map rhinoClassesToJarInitializer,
    playStage <<= playStage.dependsOn(rhinoClassesToJar),
    playStage <<= (playStage, folderForRhinoJar) map {(unused, folder) =>
      IO.delete(folder / rhinoJarName)
    },
    cleanFiles <+= folderForRhinoJar { _ / rhinoJarName } //make sure jar will be deleted if play stage does not finish and cleanup jar
  )
于 2012-12-17T19:45:04.187 に答える