maven - 为什么 Maven 程序集在 SBT 程序集发现冲突时工作

标签 maven sbt maven-3 maven-assembly-plugin sbt-assembly

标题也可以是:
Maven 和 SBT 程序集插件之间有什么区别。

在将项目从 Maven 迁移到 SBT 时,我发现这是一个问题。

为了描述这个问题,我创建了一个示例项目,其中的依赖项根据构建工具的不同而表现不同。

https://github.com/atais/mvn-sbt-assembly

唯一的依赖是(sbt 风格)

"com.netflix.astyanax" % "astyanax-cassandra" % "3.9.0",
"org.apache.cassandra" % "cassandra-all" % "3.4",

我不明白的是,为什么mvn package成功创建了 fat jar 子,而 sbt assembly产生冲突:
[error] 39 errors were encountered during merge
[error] java.lang.RuntimeException: deduplicate: different file contents found in the following:
[error] /home/siatkowskim/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.7.7.jar:org/apache/commons/logging/<some classes>
[error] /home/siatkowskim/.ivy2/cache/commons-logging/commons-logging/jars/commons-logging-1.1.1.jar:org/apache/commons/logging/<some classes>
...
[error] /home/siatkowskim/.ivy2/cache/com.github.stephenc.high-scale-lib/high-scale-lib/jars/high-scale-lib-1.1.2.jar:org/cliffc/high_scale_lib/<some classes>
[error] /home/siatkowskim/.ivy2/cache/com.boundary/high-scale-lib/jars/high-scale-lib-1.0.6.jar:org/cliffc/high_scale_lib/<some classes>
...

最佳答案

扩展到 Alexey Romanov answer .

我也更新了my project有详细的解释,所以你可能想看看。

听从建议

You can verify it for this case by unpacking the jar Maven produces and the dependency jars in SBT error message, then checking which .class file Maven used.



我比较了fat-jars制作人 mavensbt
  • MergeStrategy.first ,显示了一些额外的文件
  • MergeStrategy.last ,显示二进制差异和额外文件

  • 我已经采取了下一步并检查了 fat-jars针对依赖项 sbt发现冲突,特别是:
  • jcl-over-slf4j-1.7.7.jar
  • commons-logging-1.1.1.jar

  • 结论
    maven-assembly-plugin解决 jar 上的冲突等级。
    当它发现任何冲突时,它会选择第一个 jar并且简单地忽略来自另一个的所有内容。

    sbt-assembly混合所有 class文件,在本地解决冲突,逐个文件。

    我的理论 会,如果你的 fat-jarmaven-assembly-plugin 制成工作,你可以
    指定 MergeStrategy.first对于 sbt 中的所有冲突.
    他们唯一的区别是,jarsbt 制作会更大,包含被 maven 忽略的额外类.

    关于maven - 为什么 Maven 程序集在 SBT 程序集发现冲突时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249818/

    相关文章:

    java - 从自定义 Maven 插件中,是否可以知道 Maven 是否是通过 '-f' 调用的?

    scala - 如何从 build.sbt 文件中获取设置值

    java - 如何mvn部署-部署:file from java app

    mysql - Spring Boot 的数据源错误

    java - 从命令行运行 Maven Web 应用程序

    eclipse - scala sbt 缓存 x eclipse 构建路径

    scala - sbt 下载组件失败

    java - 如何安排一阶段执行?

    java - 如何配置 Guice 3.0 的 Maven 依赖项以便在没有 AOP 的情况下使用?

    Maven:依赖出现在有效的pom中但不在依赖树中