首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SBT中的包为源和资源生产两个单独的jars?

使用SBT中的包为源和资源生产两个单独的jars?
EN

Stack Overflow用户
提问于 2014-03-09 21:45:34
回答 1查看 574关注 0票数 0

由于某些资源文件的大小很大,我希望sbt package同时创建2个jar文件,例如类的project-0.0.1.jar和资源的project-0.0.1-res.jar

这可行吗?

基于以下答案的解决方案感谢@gilad-hoch

1) unmanagedResources in Compile := Seq()

现在,它只是默认jar中的类。

2)

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-10 09:45:04

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

代码语言:javascript
复制
unmanagedResources in Compile := Seq()

要添加另一个jar,可以定义一个新任务。通常是这样的:使用sbt.IO jar方法创建jar。你可以使用这样的东西:

代码语言:javascript
复制
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)]。基本上这就是整个交易..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22288585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档