Playframework 将SBT和Play Framework 2.1编译的Javascript类文件放在哪里可以找到它们?

Playframework 将SBT和Play Framework 2.1编译的Javascript类文件放在哪里可以找到它们?,playframework,sbt,rhino,playframework-2.1,Playframework,Sbt,Rhino,Playframework 2.1,我应该把我编译的(通过Rhino)Javascript类放在哪里,以便它们被保存 编译期间包含在类路径上,并包含在生成的 distbundle Play Framework 2.1-RC1+SBT会忽略它们,有时在 编译,有时在生成dist bundle时 1.将生成的文件放入classes/或classes\u managed/ 如果将生成的.class文件放在此处或此处: target/scala-2.10/classes/ target/scala-2.10/classes\u manag

我应该把我编译的(通过Rhino)Javascript类放在哪里,以便它们被保存 编译期间包含在类路径上,并包含在生成的
dist
bundle

Play Framework 2.1-RC1+SBT会忽略它们,有时在 编译,有时在生成dist bundle时

1.将生成的文件放入
classes/
classes\u managed/
如果将生成的.class文件放在此处或此处:
target/scala-2.10/classes/
target/scala-2.10/classes\u managed/

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

2.将类放置在专用目录中 如果我将生成的.class文件放在此处:
target/scala-2.10/compiledjs类/

并将类路径条目添加到SBT的配置中:

object ApplicationBuild extends Build {
  ...
  def mainSettings = List(
    ...,
    unmanagedClasspath in Compile <+= (baseDirectory) map { bd =>
      Attributed.blank(bd / "target/scala-2.10/compiledjs-classes")
    },
    ...)
对象应用程序构建扩展了构建{
...
def main设置=列表(
...,
编译中的非托管类路径
Attributed.blank(bd/“target/scala-2.10/compiledjs类”)
},
...)
然后
编译
运行
阶段
dist
工作正常。然而!当我解开拉链 启动生成的.zip文件(通过
dist
生成),然后启动应用程序 运行时失败,因为编译的Javascript类未包含在 拉链

3.在lib/文件夹中放置类 然后,
compile
将找不到类文件。 (例如,我将class
compiledjs.HtmlSanitizerJs
放在
lib/compiledjs/HtmlSanitizerJs.class


我该怎么办?我的意思是,什么有效,什么是最佳实践

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

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

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

我为您创建了一个要点,所以您可以查看并尝试: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
  )
val rhinoJarName=“rhino.jar”
val folderForRhinoJar=非托管数据库
val rhinoClasspath=(baseDirectory)映射{base=>Attributed.blank(base/“rhino”)}
val rhinoClassesToJar=TaskKey[Unit](“rhino类到jar”)
val rhinoclassestojar初始值设定项=(base:File,folderForJar:File)=>{
val rhinoFolder=新文件(基,“rhino”)
val isClassFile=(file:file)=>file.getName.endsWith(“类”)
val classFiles=rhinoFolder.**.filter(isClassFile.get)
val sources=classFiles映射{file=>
文件->文件.getCanonicalPath.drop(rhinoFolder.getCanonicalPath.length+1)
}
jar(sources,folderForJar/rhinoJarName,new java.util.jar.Manifest())
}
val main=play.Project(appName、appVersion、appDependencies)。设置(

编译中的unmanagedClasspath我找不到将类文件放入stage任务中的JAR的方法。作为一种解决方法,我在stage和play运行时生成一个JAR文件,我将类路径设置为基本文件夹中的“rhino”文件夹

我为您创建了一个要点,所以您可以查看并尝试: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
  )
val rhinoJarName=“rhino.jar”
val folderForRhinoJar=非托管数据库
val rhinoClasspath=(baseDirectory)映射{base=>Attributed.blank(base/“rhino”)}
val rhinoClassesToJar=TaskKey[Unit](“rhino类到jar”)
val rhinoclassestojar初始值设定项=(base:File,folderForJar:File)=>{
val rhinoFolder=新文件(基,“rhino”)
val isClassFile=(file:file)=>file.getName.endsWith(“类”)
val classFiles=rhinoFolder.**.filter(isClassFile.get)
val sources=classFiles映射{file=>
文件->文件.getCanonicalPath.drop(rhinoFolder.getCanonicalPath.length+1)
}
jar(sources,folderForJar/rhinoJarName,new java.util.jar.Manifest())
}
val main=play.Project(appName、appVersion、appDependencies)。设置(

编译中的unmanagedClasspath您可以尝试2.使用不在目标中但在baseDirectory中的文件夹吗?@Schleichardt完成。编译工作,但
stage
dist
不工作(因为当找不到生成的类时,
java.lang.NoClassDefFoundError
)。并且,在SBT中,
classpath
命令没有列出不在目标中但在baseDirectory中的文件夹,在我的例子中,即
compiledjs类
。但是,
show full classpath
确实列出了该文件夹,
compiledjs类
。因此,我所做的似乎是告诉SBT在编译时包括该文件夹仅,但不是在生成dist时?在SBT中,
clean
不会删除
compiledjs classes
文件夹。对于clean问题,存在一个解决方案:可以尝试2.使用不在目标中但在baseDirectory中的文件夹吗?@Schleichardt Done。编译工作正常,但
stage
dist
不工作(因为
java.lang.NoClassDefFoundError
,当找不到生成的类时)。并且,在SBT中,
classpath
命令没有列出不在目标中但在baseDirectory中的文件夹,在我的例子中,即
compiledjs类
。Howev