maven解决包冲突方法详解

 更新时间:2019年10月27日 10:17:01   作者:Yujiaao  
这篇文章主要介绍了maven解决包冲突方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Maven根据最近胜利策略(nearest wins strategy)的原则工作,同时解决依赖冲突,这意味着它在依赖树中找到更接近的版本,它将采用该版本并忽略其他版本。实际上Maven有点懒,所以每当它开始寻找依赖时,它就会从根目录开始遍历树,无论它先前找到哪个版本,它都会选择它并从它们返回而不进一步。如果它进一步寻找依赖版本,可能会有机找到一些更新的版本,但它从第一个发现的版本那里返回,并采用旧版本并用它来解决依赖关系。

可以用下面的命令显示依赖树:

mvn dependency:tree

老实说,这不是maven的错,因为它想尽快完成这项工作。最重要的是,maven 不知道你的应用程序期望哪个版本,所以Maven会告诉你,嘿,你有责任让我知道你想要哪个版本,如果你不告诉我,我会以自己的方式工作,即更近更好。

请下载本文的github源代码:

https://github.com/yujiaao/maven-dependency-conflict-demo

我们有一个 web 应用 resolve-web,该工程依赖于 project-A 和project-B,project-A 依赖于 project-common 的 1.0 版本并调用其中的 sayHello() 方法。project-B 依赖于project-C,而project-C又进一步依赖于project-common的2.0 版本并调用其中的 sayGoodBye() 方法。project-common 的 1.0 和 2.0 版本是不同的,1.0 中之包含sayHello() 方法,而2.0 中包含了sayHello()和sayGoodBye()两个方法。整个项目的依赖关系如下图:

根据Maven的transitive依赖机制,resolve-web 将同时依赖于project-common 的 1.0 和 2.0 版本,这就造成了依赖冲突。而根据最近获胜策略,Maven 将选择 project-common 的 1.0 版本作为最终的依赖。

这和 Gradle 不同,Gradle 在默认情况下将选择最新的版本作为获胜版本。

而对于Maven,由于proejct-common的1.0版本比2.0版本在依赖树中离resolve-web更近,故 1.0 版本获胜。在 resolve-web 中执行mvn dependency:tree -Dverbose 可以看到 resolve-web 的依赖关系:

[INFO] resolve-web:resolve-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] +- project-B:project-B:jar:1.0:compile
[INFO] | \- project-C:project-C:jar:1.0:compile
[INFO] |   \- (project-common:project-commmon:jar:2.0:compile - omitted for conflict with 1.0)
[INFO] +- project-A:project-A:jar:1.0:compile
[INFO] | \- project-common:project-commmon:jar:1.0:compile
[INFO] \- javax.servlet:servlet-api:jar:2.4:provided

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring boot项目中异常拦截设计和处理详解

    Spring boot项目中异常拦截设计和处理详解

    这篇文章主要介给大家绍了关于Spring boot项目中异常拦截设计和处理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
    2018-12-12
  • Spring远程加载配置的实现方法详解

    Spring远程加载配置的实现方法详解

    这篇文章主要介绍了Spring远程加载配置的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 基于SpringBoot+Redis实现一个简单的限流器

    基于SpringBoot+Redis实现一个简单的限流器

    在Spring Boot中使用Redis和过滤器实现请求限流,过滤器将在每个请求到达时检查请求频率,并根据设定的阈值进行限制,这样可以保护您的应用程序免受恶意请求或高并发请求的影响,本文我们通过Spring Boot +Redis 实现一个轻量级的消息队列,需要的朋友可以参考下
    2023-08-08
  • HTTP 415错误-Unsupported media type详解

    HTTP 415错误-Unsupported media type详解

    这篇文章主要介绍了HTTP 415错误-Unsupported media type详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java 8中字符串拼接新姿势StringJoiner详解

    Java 8中字符串拼接新姿势StringJoiner详解

    在本篇文章里小编给大家整理了关于Java 8中字符串拼接新姿势StringJoiner的详解内容,需要的朋友们参考下。
    2019-09-09
  • Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程

    Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程

    这篇文章主要介绍了Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java 编程中十个处理异常的建议

    Java 编程中十个处理异常的建议

    这篇文章主要介绍了Java 编程中十个处理异常的建议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringCloud+RocketMQ实现分布式事务的实践

    SpringCloud+RocketMQ实现分布式事务的实践

    分布式事务已经成为了我们的经常使用的。所以我们来一步一步的实现基于RocketMQ的分布式事务。感兴趣的可以了解一下
    2021-10-10
  • 一文详解如何查看jdk版本及安装路径

    一文详解如何查看jdk版本及安装路径

    这篇文章主要给大家介绍了关于如何查看jdk版本及安装路径的相关资料,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

    微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

    本篇文章主要介绍了微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12

最新评论