Java 当sbt运行正常时,为什么在sbt onejar下Apache公共依赖项发生冲突?

Java 当sbt运行正常时,为什么在sbt onejar下Apache公共依赖项发生冲突?,java,sbt,apache-commons,Java,Sbt,Apache Commons,我的项目直接依赖于commons配置(1.6),但也可以通过过渡方式拉动: commons beanutils核心版(1.8.0)和commons集合版(3.2.1) 最后两个似乎相互冲突,可能是因为它们都在packageorg.apache.commons.collections中定义了类。我假设,因为在运行结果jar(与sbt pluginsbt onejar打包)时,我在输出中看到很多错误,如: JarClassLoader:警告: 中的org/apache/commons/collect

我的项目直接依赖于
commons配置
(1.6),但也可以通过过渡方式拉动:
commons beanutils核心版(1.8.0)和
commons集合版(3.2.1)

最后两个似乎相互冲突,可能是因为它们都在package
org.apache.commons.collections
中定义了类。我假设,因为在运行结果jar(与sbt plugin
sbt onejar
打包)时,我在输出中看到很多错误,如:

JarClassLoader:警告: 中的org/apache/commons/collections/FastHashMap.class lib/commons-beanutils-core-1.8.0.jar被 lib/commons-collections-3.2.1.jar(使用不同的字节码)

奇怪的是,当我只是“sbt运行”(而不是生成一个jar并手动运行它)时,这并没有出现


我是做错了什么,还是LIB中真的存在冲突?

您应该能够通过
sbt update
了解依赖关系,并查看
目标/分辨率缓存/报告下的报告。它们适用于构建中的每个配置

如果您可以将构建更新为sbt 0.13.6(在
project/build.properties
中),则可以使用
executed
任务。阅读:

sbt 0.13.6在通过更新任务解析项目的托管依赖项时显示逐出警告

后来

要显示所有包含调用方信息的收回警告,请运行收回任务

它还可以让您了解依赖关系的版本


一旦你弄清楚了什么样的依赖关系带来了受影响类的给定版本,你就可以
excludeAll
it()。

这一定是我无法解释的sbt onejar woodoo。由于它与
sbt run
配合使用,我想知道您需要sbt-onejar做什么?sbt native packager是否有帮助(也许不会出现问题)?它似乎确实可以与sbt native packager配合使用(使用“stage”)。然而,这会产生很多文件,而我现在想保留“app=1 file”模型(应用本身仍然很小,并且没有依赖关系,所以大小不是问题)以便于部署。有人报告了一个类似的问题:,sbt onejar作者建议修复类路径。但在这种情况下,此人使用的是同一库的两个不同版本。在我的例子中,副本来自不同的公共图书馆。啊,对。您的主要目标是在一个jar中拥有一个应用程序,并捆绑所有依赖项和其他文件。不幸的是,尽管beanutils在1.9+版本中似乎已修复,但我找不到依赖于此类最新版本的配置版本。因此,我的解决方案/解决方案是禁用一个(显然不需要的)依赖项:
libraryDependencies+=“commons配置”%“commons配置”%“1.6”excludeAll(排除规则(excludeRule)(organization=“commons beanutils”,name=“commons beanutils core”)、排除规则(organization=“commons beanutils”,name=“commons beanutils”))
我不确定“驱逐”到底是什么意思。通过阅读发行说明,我想说它只查看依赖关系版本,并在拉取两个不同的冲突版本时发出警告。在我的例子中,冲突来自两个不同名称的lib中的重复类。也许这就是为什么我在sbt 0.13.6中没有收到任何警告,比如“更新”或“驱逐”(也不是“一个jar”)。