由于某些资源文件很大,我希望sbt package
同时创建2个jar文件,例如:类的project-0.0.1.jar
和资源的project-0.0.1-res.jar
。
这可行吗?
[解决方案]基于以下答案,感谢@ gilad-hoch
1)unmanagedResources in Compile := Seq()
现在它只是默认jar中的类。
2)
val packageRes = taskKey[File]("Produces a jar containing only the resources folder")
packageRes := {
val jarFile = new File("target/scala-2.10/" + name.value + "_" + "2.10" + "-" + version.value + "-res.jar")
sbt.IO.jar(files2TupleRec("", file("src/main/resources")), jarFile, new java.util.jar.Manifest)
jarFile
}
def files2TupleRec(pathPrefix: String, dir: File): Seq[Tuple2[File, String]] = {
sbt.IO.listFiles(dir) flatMap {
f => {
if (f.isFile) Seq((f, s"${pathPrefix}${f.getName}"))
else files2TupleRec(s"${pathPrefix}${f.getName}/", f)
}
}
}
(packageBin in Compile) <<= (packageBin in Compile) dependsOn (packageRes)
现在,当我执行“sbt package”时,默认jar和资源jar都会同时生成。
答案 0 :(得分:0)
要在主jar中不包含资源,您只需添加以下行:
unmanagedResources in Compile := Seq()
添加另一个jar,您可以定义一个新任务。它通常是这样的:
使用sbt.IO jar
方法创建jar。
你可以使用类似的东西:
def files2TupleRec(pathPrefix: String, dir: File): Seq[Tuple2[File,String]] = {
sbt.IO.listFiles(dir) flatMap {
f => {
if(f.isFile) Seq((f,s"${pathPrefix}${f.getName}"))
else files2TupleRec(s"${pathPrefix}${f.getName}/",f)
}
}
}
files2TupleRec("",file("path/to/resources/dir")) //usually src/main/resources
或使用Path
中的内置方法创建sources: Traversable[(File, String)]
方法所需的jar
。
这基本上就是整个交易...