SBT在装配期间允许重复

时间:2015-01-25 17:20:00

标签: assembly sbt deduplication

enter code here有没有办法在 SBT的 assembly插件中关闭重复?

我一直在清理sbt assembly以旧式方式构建,使用sbt dependency-graph删除具有相同文件的不同版本的jar文件。

  • 如果我只是使用 last 作为策略,那么生成的jar文件在运行makeJar时会出现重复条目​​。
  • 如果我使用 discard 作为策略,则生成的jar文件很简单,其中没有任何内容。

但是,在我的情况下,这不是一个大问题:我想完全避免重复复制,如果我遇到问题,稍后在运行时,清除依赖冲突。这通常是像 maven 这样的工具如何工作,我想使用SBT来构建类似于这些工具构建的胖罐的罐子。

1 个答案:

答案 0 :(得分:0)

我能够提出一个合理的合并策略,看起来像这样,取自https://github.com/moser/foxtrot_mike_client/blob/master/build.sbt

mergeStrategy in assembly := { 
  case n if n.startsWith("META-INF/eclipse.inf") => MergeStrategy.discard
  case n if n.startsWith("META-INF/ECLIPSEF.RSA") => MergeStrategy.discard
  case n if n.startsWith("META-INF/ECLIPSE_.RSA") => MergeStrategy.discard
  case n if n.startsWith("META-INF/ECLIPSEF.SF") => MergeStrategy.discard
  case n if n.startsWith("META-INF/ECLIPSE_.SF") => MergeStrategy.discard
  case n if n.startsWith("META-INF/MANIFEST.MF") => MergeStrategy.discard
  case n if n.startsWith("META-INF/NOTICE.txt") => MergeStrategy.discard
      case n if n.startsWith("META-INF/NOTICE") => MergeStrategy.discard
      case n if n.startsWith("META-INF/LICENSE.txt") =>     
 MergeStrategy.discard
      case n if n.startsWith("META-INF/LICENSE") => MergeStrategy.discard
      case n if n.startsWith("rootdoc.txt") => MergeStrategy.discard
      case n if n.startsWith("readme.html") => MergeStrategy.discard
      case n if n.startsWith("readme.txt") => MergeStrategy.discard
      case n if n.startsWith("library.properties") => MergeStrategy.discard
      case n if n.startsWith("license.html") => MergeStrategy.discard
      case n if n.startsWith("about.html") => MergeStrategy.discard
      case _ => MergeStrategy.deduplicate
    }

原始问题的答案很简单,你必须在使用sbt程序集时定义MergeStrategy,并且有很多模板(比如这个)可以借用并粘贴到 build.sbt中文件。