使用SBT包装生产两个用于来源和资源的罐子



由于某些资源文件的大尺寸,我希望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软件包"时,默认jar和资源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中的内置方法创建jar方法所需的sources: Traversable[(File, String)]。基本上是整个交易...

最新更新