2

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

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

sbt test:assembly

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

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配置

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

4

1 回答 1

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)
  }
}
于 2014-11-17T08:16:47.083 回答