使用SBT包装为源和资源生产两个独立的罐子?

时间:2014-03-09 21:45:34

标签: 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 package”时,默认jar和资源jar都会同时生成。

1 个答案:

答案 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。 这基本上就是整个交易...