如何修复程序集合并错误?

时间:2018-02-19 02:29:37

标签: scala sbt

我尝试为整个scala应用和包含一些包的另一个.jar生成一个.jar

合并两者时出现此错误。

[error] errors were encountered during merge
[error] java.lang.RuntimeException: deduplicate: different file contents found in the following:
[error] /proj/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.10.0.jar:META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
[error] /proj/.ivy2/cache/io.sensefly.logging.log4j/log4j-cloudwatch-appender/jars/log4j-cloudwatch-appender-1.0.1.jar:META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
[error] deduplicate: different file contents found in the following:
[error] /proj/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.7.25.jar:org/apache/commons/logging/Log.class
[error] /proj/.ivy2/cache/commons-logging/commons-logging/jars/commons-logging-1.1.3.jar:org/apache/commons/logging/Log.class
[error] deduplicate: different file contents found in the following:
[error] /proj/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.7.25.jar:org/apache/commons/logging/LogConfigurationException.class

2 个答案:

答案 0 :(得分:1)

我的同事也遇到了同样的问题。我们在public void zeroWriteDelete(File file) throws IOException{ long length = file.length(); RandomAccessFile raf = new RandomAccessFile(file, "rw"); byte[] buffer = new byte[4 * 1024]; for (long i = 0; i < length; i += buffer.length) { raf.write(buffer, 0, (int)Math.min(buffer.length, length-i)); } raf.close(); file.delete(); // you forgot this rather vital part } 文件中添加了以下代码段。它帮助了我们。

built.sbt

答案 1 :(得分:0)

看起来您有多个冲突的日志库。这里有很多关于SO的问题,例如:How to exclude commons-logging from a scala/sbt/slf4j project?

您将是判断如何处理此问题的最佳人选,因为您希望知道您需要哪个日志库。

有多种方法可以解决这个问题。您可以选择一个日志库或任何其他冲突的依赖项,并使用exclude排除其余的。文档在这里:https://www.scala-sbt.org/1.x/docs/Library-Management.html#Exclude+Transitive+Dependencies。如果您的一个或多个库正在传递记录器依赖性,则可以排除该传递依赖性并明确提供。它很可能来自你的JAR。

另一种更黑客的方法是使用合并策略逐个处理冲突文件:https://github.com/sbt/sbt-assembly#merge-strategy。您可以简单地取一个文件而忽略其他文件。这并不总是有用,可能有API compat问题。这就是为什么在这种情况下它更像是黑客攻击的原因,但可以帮助让讨厌的文件不受影响。

最后,更糟糕的方法是编辑您的JAR(存档)并删除冲突的文件。

使用https://github.com/jrudolph/sbt-dependency-graph帮助您了解/可视化传递依赖性的来源。

相关问题