我应该将我编译的(通过Rhino)Javascript类放在哪里
在编译期间包含在类路径中,并包含在生成的
dist
捆绑?
Play Framework 2.1-RC1 + SBT忽略它们,有时在期间 编译,有时候在生成dist包时。
classes/
或classes_managed/
如果我将生成的.class文件放在这里或这里:
target/scala-2.10/classes/
target/scala-2.10/classes_managed/
然后compile
和run
正常工作。但是stage
和dist
期间的一些奇怪的编译步骤(什么?!)失败了:它找不到编译的类。
如果我将生成的.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。
然后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/
中。 ))
答案 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
)