问题描述
最近两三天,我一直在尝试解决sbt程序集构建逻辑的某些问题。与assemblyMergeStrategy
有关。 SBT版本1.2.8。
它看起来像这样:
assemblyMergeStrategy in assembly := {
case PathList("javax","inject",_ @ _*) => MergeStrategy.last
case PathList("javax","servlet","activation",_ @ _*) => MergeStrategy.last
case PathList("org","apache",_ @ _*) => MergeStrategy.last
case PathList("com","google","typesafe","microsoft",xs @ _*) => MergeStrategy.last
case "about.html" => MergeStrategy.rename
case "plugin.properties" => MergeStrategy.last
case "log4j.properties" => MergeStrategy.last
case PathList("meta-inf",xs @ _*) =>
xs match {
case "MANIFEST.MF" :: Nil => MergeStrategy.discard
case "mailcap" :: Nil => MergeStrategy.last
case "mimetypes.default" :: Nil => MergeStrategy.last
// Concatenate everything in the services directory to keep GeoTools happy.
case "services" :: _ :: Nil =>
MergeStrategy.concat
// Concatenate these to keep JAI happy.
case "javax.media.jai.registryFile.jai" :: Nil | "registryFile.jai" :: Nil |
"registryFile.jaiext" :: Nil =>
MergeStrategy.concat
case name :: Nil => {
// Must exclude meta-inf/*.([RD]SA|SF) to avoid "Invalid signature file digest for Manifest main attributes" exception.
if (name.endsWith(".RSA") || name.endsWith(".DSA") || name.endsWith(".SF"))
MergeStrategy.discard
else
MergeStrategy.first
}
case _ => MergeStrategy.first
}
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
//MergeStrategy.first
}
出于某种原因,我不认为com.microsoft合并策略已被选中或类似之类。
[error] 1 error was encountered during merge
[error] java.lang.RuntimeException: deduplicate: different file contents found in the following:
[error] /Users/t23528/.ivy2/cache/com.microsoft.azure/azure-mgmt-appservice/jars/azure-mgmt-appservice-1.23.0.jar:maven.properties
[error] /Users/t23528/.ivy2/cache/com.microsoft.azure/azure-mgmt-batch/jars/azure-mgmt-batch-1.23.0.jar:maven.properties
[error] /Users/t23528/.ivy2/cache/com.microsoft.azure/azure-mgmt-batchai/jars/azure-mgmt-batchai-1.23.0.jar:maven.properties
还有来自Microsoft jar的许多错误,都带有相同的maven.properties
错误。
如果我将程序集的最后一部分保留为
case x =>
//val oldStrategy = (assemblyMergeStrategy in assembly).value
//oldStrategy(x)
MergeStrategy.first
构建通过。知道我在做什么错吗?任何帮助将不胜感激。
我尝试升级到最新的sbt版本1.3.13,看起来它正在使用其他缓存,不再是ivy2
而是Coursier
。
[error] 1 error was encountered during merge
[error] java.lang.RuntimeException: deduplicate: different file contents found in the following:
[error] /Users/t23528/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/microsoft/azure/azure-mgmt-appservice/1.23.0/azure-mgmt-appservice-1.23.0.jar:maven.properties
[error] /Users/t23528/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/microsoft/azure/azure-mgmt-batch/1.23.0/azure-mgmt-batch-1.23.0.jar:maven.properties
谢谢。
解决方法
您能尝试这样的事情吗?
case x if x.contains("com.microsoft") => MergeStrategy.last