为什么当 SBT 程序集发现冲突时 Maven 程序集可以工作

2023-12-24

标题也可以是:
Maven 和 SBT 组装插件之间有什么区别?

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

为了描述这个问题,我创建了一个示例项目,其中的依赖项我发现它的行为有所不同,具体取决于构建工具。

https://github.com/atais/mvn-sbt-assemble 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>
...

延伸至阿列克谢·罗曼诺夫 答案 https://stackoverflow.com/a/50464199/1549135.

我也更新了我的项目 https://github.com/atais/mvn-sbt-assembly有详细的解释,所以你可能想检查一下。

遵循建议

您可以通过解压 Maven 生成的 jar 和 SBT 错误消息中的依赖项 jar,然后检查 Maven 使用哪个 .class 文件来验证这种情况。

我比较了fat-jars由。。。生产maven and sbt with

  • MergeStrategy.first,显示了一些额外的文件
  • MergeStrategy.last,显示二进制差异和额外文件

我已采取下一步并检查了fat-jars反对依赖关系sbt发现冲突,具体为:

  • jcl-over-slf4j-1.7.7.jar http://central.maven.org/maven2/org/slf4j/jcl-over-slf4j/1.7.7/jcl-over-slf4j-1.7.7.jar
  • commons-logging-1.1.1.jar http://central.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar

结论

maven-assembly-plugin解决冲突jar等级。 当它发现任何冲突时,它会选择第一个jar并简单地忽略对方的所有内容。

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

我的理论会是,如果你的fat-jar用做的maven-assembly-plugin有效,你可以 指定MergeStrategy.first对于所有的冲突sbt。 他们唯一的区别是,jar生产与sbt将会更大,包含被忽略的额外类maven.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么当 SBT 程序集发现冲突时 Maven 程序集可以工作 的相关文章

  • Spring 5.0.3 依赖问题

    升级到 spring 5 0 3 后我遇到以下问题 09 25 29 141 ERROR org jboss msc service fail ServerService Thread Pool 175 MSC000001 Failed t
  • 如何创建特定于组织的 Maven Parent POM?

    任何人都可以解释如何创建特定于组织的父 POM 在这里我不是在寻找多模块项目 我要创建的 POM 将被所有项目使用 每个项目都有自己的父 pom 它扩展了组织特定的 POM 请提供一些如何在 Eclipse 中创建的步骤 父POM在Mave
  • Build.scala中%和%%符号含义

    我是新来玩的 Framework 2 1 java版本 并且没有scala经验 我不明白什么是以及什么是 and 在 Build scala 中表示 我用谷歌搜索了它们但找不到它们的含义 在我的 Build scala 文件中 我有 org
  • SBT 对 Scala 类型感到困惑

    SBT 抛出以下错误 value split is not a member of String String error filter arg gt arg split delimiter length gt 2 对于以下代码块 impl
  • Gradle 未在 Android Studio 中同步

    我是 Android studio 的新手 我正在尝试建立一个新项目 但遇到以下错误消息 Could not find com android tools build gradle 7 0 4 Searched in the followi
  • Maven 未运行 Spring Boot 测试

    我有一个要测试的 Spring Boot REST API 我可以在 Eclipse 中手动运行测试 无需 Maven 并通过将应用程序作为 JUnit 测试运行 它运行良好并显示结果 但是mvn test正如您将在下面发现的那样 它不起作
  • 如何自动执行使用 Maven 构建的 Eclipse 插件的版本号更新过程

    我正在处理一个与该项目类似的项目此处描述 http www vogella com articles EclipseTycho article html 因此 它在父 pom xml 中有一些模块
  • Maven 库的可选 Gradle 依赖项

    我正在开发一个 Android 库 并且仅当使用我的库的项目也包含该依赖项时才想使用该依赖项 类似于什么Picasso https github com square picasso与OkHttp https github com squa
  • 如何使用 Maven Failsafe 插件运行 JUnit 5 集成测试?

    当我运行命令时 Maven Failsafe 插件找不到我的 JUnit 5 集成测试mvn clean failsafe integration test 尽管它可以找到文件 我有junit jupiter api and junit j
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 通过 SSH 的 sbt (Scala) 结果找不到命令,但如果我自己这样做就可以工作

    所以我正在尝试做一些涉及跑步的事情sbt通过 SSH 命令 这就是我正在尝试的 ssh my username
  • 无法在 Eclipse 中运行从 Git 导入的项目

    我的 Eclipse 工作区中有一个来自 Github 的项目 通过 File gt Import gt Projects from GIT 但是 我无法运行该示例 因为 运行方式 下的唯一选项是 运行配置 转到 运行配置 后 我单击 浏览
  • Maven依赖关系无法解决

    我在用着阿帕奇Maven3两三天以来 一些依赖关系无法再解决 这首先没有问题 更具体地说 它是 maven findbgs plugin plugin 1 3 1 maven cobertura plugin plugin 1 3 它们不应
  • 读取 git 的最后一次提交和提交号

    在使用Git源代码的maven项目中 每当我使用maven编译构建时 是否可以读取git的最后一次提交和提交号 我想使用该提交编号来找到最后一次提交 这是假设您想要读取该信息 然后将其存储在属性文件中 基于https github com
  • Maven 备用 pom

    调用 Maven 构建来指定替代文件来代替标准 pom xml 文件名时是否有参数 基本上 我需要运行test我的 Maven 构建目标是使用各种配置 现在我必须使用外部脚本来使用此配置更新标准 pom 然后恢复文件 我宁愿能够维护几个单独
  • Maven编译错误:包不存在

    我正在尝试向现有企业项目添加 Maven 支持 这是一个多模块项目 前 2 个模块编译和打包没有问题 但我面临编译错误 我尝试在多个模块中使用相同的依赖项 我的结构是 gt parent gt pom xml gt module 1 gt
  • SBT - 使用汇编时多项目合并策略和构建 sbt 结构

    我有一个由多个较小项目组成的项目 其中一些项目相互依赖 例如 有一个依赖于 commons 项目的实用程序项目 其他项目可能依赖于公用事业或公共设施 也可能不依赖于两者 在 build sbt 中 我在文件末尾有程序集合并策略 以及程序集中
  • 如果无法解决依赖关系,如何告诉 Maven 忽略它?

    我有一个依赖项 已安装在 Maven 本地存储库中 并且正在本地使用 但在部署服务器上不可用 我使用该依赖项Class forName 因此 如果部署服务器上的类路径丢失了它 也不会出现问题 如果 Maven 无法解析依赖项 有什么方法可以
  • 在 Maven 中添加 java 源(.java 文件)来测试 jar

    我正在利用我的 pom xml 并且能够为 src main java 例如 app jar 以及 src test java 例如 app test jar 生成 jar 我还能够将我的 java 源代码包含在 app jar 中 即 j
  • Spring Integration 应用程序在作为打包 jar 执行时不定义通道

    我开始在工作的一个项目中使用Spring Integration 一切看起来都很好 并且在我的本地开发环境中运行顺利 当从 Eclipse 执行时 然而 当我尝试部署到我们的开发 登台环境时 我遇到了一些与 Spring Integrati

随机推荐