【问题标题】:Producing two separate jars for sources and resources with package in SBT?使用 SBT 中的包为源和资源生成两个单独的 jar?
【发布时间】:2014-07-05 15:46:40
【问题描述】:

由于部分资源文件较大,我希望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同时生成。

【问题讨论】:

    标签: sbt


    【解决方案1】:

    要在主 jar 中不包含资源,您只需添加以下行:

    unmanagedResources in Compile := Seq()
    

    要添加另一个 jar,您可以定义一个新任务。它通常是这样的: 使用sbt.IOjar 方法创建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)]。 这基本上就是全部交易......

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 2013-01-20
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2015-07-20
      • 2011-07-20
      • 2012-01-12
      相关资源
      最近更新 更多