SBT 在装配过程中允许重复

Posted

技术标签:

【中文标题】SBT 在装配过程中允许重复【英文标题】:SBT Allow duplicates during assembly 【发布时间】:2015-01-25 17:19:59 【问题描述】:

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

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

如果我只是简单地使用 last 作为策略,则生成的 jar 文件在运行 makeJar 时会失败并出现重复条目​​。 如果我使用 discard 作为策略,生成的 jar 文件是微不足道的,其中没有任何内容。

但是,就我而言,这不是一个大问题:我想完全避免重复,然后在运行时如果我遇到问题,清理依赖冲突。这通常是 ma​​ven 之类的工具的工作方式,我想使用 SBT 构建类似于这些工具构建的 fat jar 的 jar。

【问题讨论】:

注意:我已经成功地找到了一种方法来解决这个问题,方法是在 build.sbt 文件中使用mergeStrategy in assembly := MergeStrategy.discard... 。不确定这是否是一个好的解决方案。 【参考方案1】:

我想出了一个合理的合并策略,看起来像这样,取自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 文件。

【讨论】:

以上是关于SBT 在装配过程中允许重复的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ng-repeat 中允许重复?

如何在[PHP]中允许跨域[重复]

在我的 API 中允许 Origin [重复]

如何在我的字符串中允许特定值[重复]

在正则表达式电子邮件中允许 + 验证电子邮件 [重复]

在 Spring 中允许并发的正确 Bean 的 proxyMode 是啥?