栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Maven(mvn)依赖冲突,版本管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Maven(mvn)依赖冲突,版本管理

文章目录
    • 一.前言:
    • 二.前置知识:
    • 三.jar包版本管理方式
    • 四.解决依赖冲突

一.前言:

     在我们开发过程中,尤其对于Java程序员,随着插件,中间件使用越来越多,Maven依赖冲突变成了一个日益严重的问题,有时还真的令人头大,因为版本不对,冲突这些问题还会导致项目直接起不起来,Emmm,那为了规避这些问题,下面提供了比较好的管理jar版本的方式和jar包冲突的解决方法.

maven官方文档:官网地址

二.前置知识:

1.传递性:
     A依赖B,B依赖C.A能使用C中的类或代码吗?
      可以,但是只能使用依赖范围是compile的.也就是说非compile范围的依赖不能传递.

2.依赖原则:
a.路径最短者优先.(–>代表依赖)
      举例:A–>B–>C
      B–>x.jar(1.0版本)
      C–>x.jar(1.1版本)
      则最后A中编译的使用的是B中的1.0版本.
b.相同路径先声明者优先.
      举例:A–>B A–>C
      B–>x.jar(1.0版本)
      C–>x.jar(1.1版本)
     此时两个依赖路径是相同的,谁先声明(代码放在前面),A就使用谁.

3.maven中的依赖标签

  1. dependencyManagement
    dependencyManagement中定义的只是依赖的声明,并不实现引入,因此一般只用于依赖管理.

  2. type
    依赖的类型,一般就是依赖的文件类型,默认是jar,还有比如说这些值
    jar, war, ejb-client and test-jar
    在依赖管理中通常会用到pom,其实就相当于引入了一个pom文件 我们引入了这个pom,其实就相当于在项目中导入了这个pom中的所有依赖

  3. scope
    依赖的范围, 可以限制依赖的传递性和依赖什么时候会被使用,通常有以下几个值.


     这里需要注意这样一个值import,import仅仅支持用于节点中依赖类型是pom的依赖,并且该依赖项会被引入中的pom所代替,因此不存在依赖传递.
     假如我们不用import,那么被引入的pom中的所有依赖都将具有传递性.即使子模块没有声明也会被引用.官网说明如下:

三.jar包版本管理方式

1.自己建立父工程.
     这是最常见也是最实用的管理版本方式,比如当我们服务拆分成几个单独模块变成微服务时,建立父工程去管理pom就最合适了
注意父工程中仅仅只有一个pom.
样例:
父工程pom




  4.0.0

  com.wind.springcloud
  cloud2020
  1.0-SNAPSHOT

  
    Cloud-provider-payment8001
    cloud-consumer-order80
    cloud-api-commons
    cloud-euraka-server7001
    Cloud-provider-payment8004
    cloud-consumerzk-order80
    cloud-consumer-feign-order80
    cloud-provider-hystrix-payment8001
    cloud-consumer-feign-hystrix-order80
    cloud-consumer-hystrix-dashboard9001
    cloud-gateway-gateway9527
    cloud-config-center-3344
  


  pom


  
  
    UTF-8
    1.8
    1.8
    4.12
    1.2.17
    1.16.18
    8.0.19
    1.1.16
    2.2.2.RELEASE
    Hoxton.SR1
    2.1.0.RELEASE
    1.3.0
  

  
  
  
    
      
      
        org.springframework.boot
        spring-boot-dependencies
        ${spring.boot.version}
		
        pom
		
        import
      
      
      
        org.springframework.cloud
        spring-cloud-dependencies
        ${spring.cloud.version}
        pom
        import
      
      
      
      
        com.alibaba.cloud
        spring-cloud-alibaba-dependencies
        ${spring.cloud.alibaba.version}
        pom
        import
      
      
        mysql
        mysql-connector-java
        ${mysql.version}
      
      
        com.alibaba
        druid
        ${druid.version}
      
      
        org.projectlombok
        lombok
        ${lombok.version}
      
      
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        ${mybatis.spring.boot.version}
      
    
  

  
    
      
        org.springframework.boot
        spring-boot-maven-plugin
        2.4.11
        
          true
          true
        
      
    
  

  
  
    
      nexus-aliyun
      Nexus aliyun
      http://maven.aliyun.com/nexus/content/groups/public
      
        true
      
      
        false
      
    
  



子工程pom:




    
        cloud2020
        com.wind.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloudalibaba-provider-payment9001
    
    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-nacos-discovery
    
    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.boot
        spring-boot-starter-actuator
    
    
        org.springframework.boot
        spring-boot-devtools
        runtime
        true
    
    
        org.projectlombok
        lombok
        true
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    




2.引入Springboot父工程
      如果我们的项目只有单独的一个模块,并且是Springboot项目,可以直接引入Springboot帮我们构建好的模块,如下:


        org.springframework.boot
        spring-boot-starter-parent
        2.2.2.RELEASE
         
    

     我们打开这个文件看,可以直接的看到就是一个pom.也就是说我们所有引入的父工程都只是引入一个pom而已,
这也是为什么在前面我们自己构建父工程的时候,打包方式需要设置成pom

   我们直接打开spring-boot-starter-parent的pom文件看一下(如下),其实主要有几部分作用.

1.继承自spring-boot-dependencies依赖,在这个父pom中使用管理了很多的Springboot项目需要的依赖,这也是为什么我们引入了Springboot的parent依赖之后,很多Springboot的组件就不需要指定版本了.

2.指定jdk,字符集等编码.

3.一些打包时的配置

3.直接在自己pom中进行版本管理
举例:

         
          
            4.3.17.RELEASE
          
         
          
            org.springframework
            spring-core
            ${spring.version}
          
          
            org.springframework
            spring-context
            ${spring.version}
         
四.解决依赖冲突

主要有两个步骤
1.找到冲突的jar包.
使用mvn命令找到冲突jar包

mvn -Dverbose dependency:tree

输入之后会有下面的内容

[INFO] org.example:hello:jar:1.0-SNAPSHOT
[INFO] +- org.springframework:spring-context:jar:5.2.7.RELEASE:compile
[INFO] |  +- (org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE)
[INFO] |  +- org.springframework:spring-beans:jar:5.2.7.RELEASE:compile
[INFO] |  |  - (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate)
[INFO] |  +- org.springframework:spring-core:jar:5.2.7.RELEASE:compile
[INFO] |  |  - org.springframework:spring-jcl:jar:5.2.7.RELEASE:compile
[INFO] |  - org.springframework:spring-expression:jar:5.2.7.RELEASE:compile
[INFO] |     - (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate)
[INFO] - org.springframework:spring-aop:jar:5.2.0.RELEASE:compile
[INFO]    +- (org.springframework:spring-beans:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)
[INFO]    - (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)

   其中omitted for duplicate表示有jar包被重复依赖,最后写着omitted for conflict with xxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入。比如上面有一行最后写着omitted for conflict with 5.2.7.RELEASE,表示spring-core 5.2.0版本不会被项目引用,而spring-core 5.2.7版本会被项目引用

2.统一版本

主要有以下三种方式:

  • 利用依赖原则统一
    就是前面所提到的利用最短路径和优先声明的原则进行统一版本

  • 将多余的依赖进行排除

          
                
                    
                    
                
            
  • 第三种方式就是前面提到的利用jar包版本管理方式进行版本统一化.
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号