哪里编译了用于SBT和Play Framework 2.1的Javascript类文件来查找它们?

时间:2012-12-12 08:23:22

标签: playframework sbt rhino playframework-2.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/

然后compilerun正常工作。但是stagedist期间的一些奇怪的编译步骤(什么?!)失败了:它找不到编译的类。

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")
    },
    ...)

然后compilerunstagedist正常工作。然而!当我解压缩和 启动生成的.zip文件(通过dist生成),然后启动应用程序 在运行时失败,因为编译的Javascript类不包含在中 .zip。

3。将类放在lib /文件夹

然后compile将找不到类文件。 (我把班级compiledjs.HtmlSanitizerJs放进去了 lib/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/中。 ))

1 个答案:

答案 0 :(得分:1)

我找不到将类文件放到舞台任务的jar上的方法。作为一种解决方法,我在舞台和播放运行中生成一个JAR文件,我将类路径设置为基本文件夹中的“rhino”文件夹。

我为你创建了一个要点,所以你可以查看它并尝试:https://gist.github.com/4321216 rhino / so / Example.class代表一个Rhino类,但它只是一个返回String的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
  )