sbt-assembly:如何在测试期间应用合并策略:组装

Posted

技术标签:

【中文标题】sbt-assembly:如何在测试期间应用合并策略:组装【英文标题】:sbt-assembly: How to apply merge strategy during test:assembly 【发布时间】:2014-11-01 13:37:21 【问题描述】:

在我的 sbt 项目中,我愿意生成包含 src/test/... 文件的测试 jar,以便我可以将它们重新用于其他项目。

我尝试用这个 sbt 命令生成这个测试 jar:

sbt test:assembly

在我的 build.sbt 中,我提供了以下 Test 范围配置:

import AssemblyKeys._

...

assemblySettings

Project.inConfig(Test)(assemblySettings)

jarName in (Test, assembly) := s"$name.value-test-$version.value.jar"

...

mergeStrategy in (Test, assembly) <<= (mergeStrategy in (Test, assembly))  (old) =>
 
  case "ECLIPSEF.RSA" => MergeStrategy.first
  case x => old(x)
 

此配置失败并出现以下错误:

[警告] 将 'META-INF\DEPENDENCIES' 与策略 'discard' 合并 java.lang.RuntimeException: deduplicate: 在以下发现不同的文件内容: ...\.ivy2\cache\org.eclipse.jetty.orbit\javax.transaction\orbits\javax.transaction-1.1.1.v201105210645.jar:META-INF/ECLIPSEF.RSA ...\.ivy2\cache\org.eclipse.jetty.orbit\javax.servlet\orbits\javax.servlet-3.0.0.v201112011016.jar:META-INF/ECLIPSEF.RSA ...\.ivy2\cache\org.eclipse.jetty.orbit\javax.mail.glassfish\orbits\javax.mail.glassfish-1.4.1.v201005082020.jar:META-INF/ECLIPSEF.RSA ...\.ivy2\cache\org.eclipse.jetty.orbit\javax.activation\orbits\javax.activation-1.1.0.v201105071233.jar:META-INF/ECLIPSEF.RSA 在 sbtassembly.Plugin$Assembly$.sbtassembly$Plugin$Assembly$$applyStrategy$1(Plugin.scala:253) 在 sbtassembly.Plugin$Assembly$$anonfun$15.apply(Plugin.scala:27​​0) 在 sbtassembly.Plugin$Assembly$$anonfun$15.apply(Plugin.scala:267) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 在 scala.collection.Iterator$class.foreach(Ite​​rator.scala:727) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1157) 在 scala.collection.IterableLike$class.foreach(Ite​​rableLike.scala:72) ... [错误] (MyProject/test:assembly) deduplicate: 在以下发现不同的文件内容: [错误] ...\.ivy2\cache\org.eclipse.jetty.orbit\javax.transaction\orbits\javax.transaction-1.1.1.v201105210645.jar:META-INF/ECLIPSEF.RSA ...

似乎测试范围的mergeStrategy配置被忽略了(Test, assembly)

我的问题是 - 如何配置 build.sbttest:assembly 生成的 jar 启用 mergeStrategy

【问题讨论】:

我也遇到了同样的问题,***.com/questions/25144484/…解决了 @Alexander:我很抱歉,但我看不出你的例子与我已经做过的有什么不同。我的问题与组装期间通常无法合并无关!我的问题是无法仅在 TEST 组装期间合并 【参考方案1】:

RSA 文件问题将在 0.12.0 中默认修复。

您编写的合并策略很接近。它需要META-INF 作为模式的一部分。

mergeStrategy in (Test, assembly) <<= (mergeStrategy in (Test, assembly))  (old) =>
  
    case case PathList("META-INF", "ECLIPSEF.RSA") => MergeStrategy.first
    case x => old(x)
  

【讨论】:

以上是关于sbt-assembly:如何在测试期间应用合并策略:组装的主要内容,如果未能解决你的问题,请参考以下文章

sbt-assembly:发现重复数据删除错误

如何在 sbt-plugin 中使用 sbt-assembly?

如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?

sbt-assembly 多模块项目?

抑制 sbt-assembly 中的主类

使用 ProGuard,对测试策略有何影响?