我应该将已编译的(通过Rhino) Javascript类放在哪里,以便在编译期间将它们包含在类路径中,并包含在生成的dist包中?
Play Framework2.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.HtmlSanitizerJs类放在lib/compiledjs/HtmlSanitizerJs.class中。)
我该怎么做?我的意思是,什么是有效的和最佳的做法?
无论如何,现在我正在将生成的类复制到两个
target/scala-2.10/compiledjs-classes/ (so编译作品)和
target/scala-2.10/classes/ (因此它们包含在生成的.zip中)
这很管用,但感觉很不对劲。
(奇怪的是,在使用较早版本的Play Framework (比RC-1更早)和我使用PlayProject而不是play.Project时,一切都很好。然后,我只将生成的类保存在target/scala-2.10/classes/中。))
发布于 2012-12-17 19:45:04
我找不到办法把类文件放到舞台上的罐子里。作为解决办法,我在舞台上生成一个JAR文件,在播放运行时,我将类路径设置为基本文件夹中的“犀牛”文件夹。
我为您创建了一个gist,所以您可以检查它并尝试:https://gist.github.com/4321216犀牛/ so /Exprese.class表示一个Rhino类,但它只是一个返回字符串的类。
添加您的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
)https://stackoverflow.com/questions/13835581
复制相似问题