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 文件。
但是,就我而言,这不是一个大问题:我想完全避免重复,然后在运行时如果我遇到问题,清理依赖冲突。这通常是 maven 之类的工具的工作方式,我想使用 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 在装配过程中允许重复的主要内容,如果未能解决你的问题,请参考以下文章