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,stage并且dist工作正常。然而!当我解压缩并启动生成的 .zip 文件(通过 生成dist)时,应用程序在运行时失败,因为已编译的 Javascript 类不包含在 .zip 中。

3. 将类放在 lib/ 文件夹中

然后compile就找不到类文件了。(我放置了例如类compiledjs.HtmlSanitizerJslib/compiledjs/HtmlSanitizerJs.class


我应该做些什么?我的意思是,什么是有效的,什么是最佳实践?

无论如何,现在我正在将生成的类复制到
target/scala-2.10/compiledjs-classes/(因此编译工作)和
target/scala-2.10/classes/(因此它们包含在生成的.zip 中)
这工作,但感觉非常错误。

((奇怪的是,在旧版本的 Play Framework(早于 RC-1)当我使用 PlayProject 而不是 play.Project 时,一切正常。然后我将生成的类保存在target/scala-2.10/classes/, 中。))

4

1 回答 1

1

我找不到将类文件放入舞台任务中的罐子的方法。作为一种解决方法,我在舞台上生成一个 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 回答