如何让 sbt-assembly 合并正确?
How to get sbt-assembly merge right?
在我们的 Scala/Scalatra 项目中,我们有针对插件 sbt-assembly
的合并策略:
assemblyMergeStrategy in assembly := {
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
[error] 11 errors were encountered during merge
java.lang.RuntimeException: deduplicate: different file contents found in the following:
~/.ivy2/cache/org.scalatra/scalatra_2.11/jars/scalatra_2.11-2.3.1.jar:mime.types
~/.ivy2/cache/com.amazonaws/aws-java-sdk-s3/jars/aws-java-sdk-s3-1.10.1.jar:mime.types
deduplicate: different file contents found in the following:
~/.ivy2/cache/commons-beanutils/commons-beanutils/jars/commons-beanutils-1.8.3.jar:org/apache/commons/collections/ArrayStack.class
~/.ivy2/cache/commons-collections/commons-collections/jars/commons-collections-3.2.1.jar:org/apache/commons/collections/ArrayStack.class
deduplicate: different file contents found in the following:
and the same error for different class names
这里正确的合并逻辑是什么?
版本:
斯卡拉:2.11.7
SBT:0.13.9
sbt-assembly: 0.13.0
我不认为,这是 "merge-strategy" 的问题,但更多的是您正在使用的库及其依赖项。
谁"pulls"这些依赖项?您具体使用了哪些库?
一种限制方法是使用 excludeAll
(以及类似的)和依赖声明。 (参见 library management in SBT ),例如
excludeAll(
ExclusionRule("commons-beanutils", "commons-beanutils-core"),
ExclusionRule("commons-collections", "commons-collections"),
ExclusionRule("commons-logging", "commons-logging"),
ExclusionRule("org.slf4j", "slf4j-log4j12"),
ExclusionRule("org.hamcrest", "hamcrest-core"),
ExclusionRule("junit", "junit"),
ExclusionRule("org.jboss.netty", "netty"),
ExclusionRule("com.esotericsoftware.minlog", "minlog")
)
我的原始问题已通过以下方式解决:
assemblyMergeStrategy in assembly := {
case PathList("org", "apache", "commons", "collections", xs @ _*) =>
MergeStrategy.last
case PathList("mime.types") =>
MergeStrategy.last
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
在我们的 Scala/Scalatra 项目中,我们有针对插件 sbt-assembly
的合并策略:
assemblyMergeStrategy in assembly := {
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
[error] 11 errors were encountered during merge java.lang.RuntimeException: deduplicate: different file contents found in the following: ~/.ivy2/cache/org.scalatra/scalatra_2.11/jars/scalatra_2.11-2.3.1.jar:mime.types ~/.ivy2/cache/com.amazonaws/aws-java-sdk-s3/jars/aws-java-sdk-s3-1.10.1.jar:mime.types
deduplicate: different file contents found in the following:
~/.ivy2/cache/commons-beanutils/commons-beanutils/jars/commons-beanutils-1.8.3.jar:org/apache/commons/collections/ArrayStack.class
~/.ivy2/cache/commons-collections/commons-collections/jars/commons-collections-3.2.1.jar:org/apache/commons/collections/ArrayStack.class
deduplicate: different file contents found in the following:and the same error for different class names
这里正确的合并逻辑是什么?
版本:
斯卡拉:2.11.7
SBT:0.13.9
sbt-assembly: 0.13.0
我不认为,这是 "merge-strategy" 的问题,但更多的是您正在使用的库及其依赖项。
谁"pulls"这些依赖项?您具体使用了哪些库?
一种限制方法是使用 excludeAll
(以及类似的)和依赖声明。 (参见 library management in SBT ),例如
excludeAll(
ExclusionRule("commons-beanutils", "commons-beanutils-core"),
ExclusionRule("commons-collections", "commons-collections"),
ExclusionRule("commons-logging", "commons-logging"),
ExclusionRule("org.slf4j", "slf4j-log4j12"),
ExclusionRule("org.hamcrest", "hamcrest-core"),
ExclusionRule("junit", "junit"),
ExclusionRule("org.jboss.netty", "netty"),
ExclusionRule("com.esotericsoftware.minlog", "minlog")
)
我的原始问题已通过以下方式解决:
assemblyMergeStrategy in assembly := {
case PathList("org", "apache", "commons", "collections", xs @ _*) =>
MergeStrategy.last
case PathList("mime.types") =>
MergeStrategy.last
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}