一:问题背景.

    Maven依赖使用方便,但是出现了依赖冲突后,一般如何解决呐?本文将以IDEA为开发工具介绍一下.

                                            方式一:使用Maven-Helper插件(推荐)

    1.1 Maven插件准备.(Maven-Helper插件).

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包

 下载后,重新启动IDEA,即可使用.

1.2 Maven-Helper使用.

点击项目的pom.xml文件.

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_02

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_03

目前项目使用的版本号是2.5的.但是有2.3的依赖存在,导致发生了冲突,如果有许多的version的,也只会使用一个其他的就会标红表示发生了依赖冲突的.

方式一:查找Source所在的位置.

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven_04

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven依赖工程打包自动修改名称_05

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_06

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_07

方式二 查找source所在的位置.

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven依赖工程打包自动修改名称_08

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_09

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_10

 1.3 目前是发现了冲突所在的详细位置了,接下来就是解决冲突了.

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_11

  

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_12

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_13

 

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_14

   

                                                   方式二(pom.xml文件鼠标右键)

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_15

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven_16

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven_17

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_18

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_19

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_20

但是这个oss对象的依赖包的冲突解决了,但是会出现问题,由于那个common-lang是Apache的工具类,那个<exclusion>标签又不加version标签,如果去掉那里这里的2.3的版本和2.5的版本就都去掉了.显然是不合理的.不建议去掉这里的冲突.

                                                        方式三(Maven命令)

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven_21

mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>

mvn dependency:tree -Dverbose -Dincludes=com.alibaba:fastjson

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_22

简单总结一个Maven依赖冲突管理中的几个原则:

  1. 依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId, version)构成。如果两个相同的依赖包,如果groupId, artifactId, version不同,那么maven也认为这两个是不同的。(唯一性)
  2. 依赖会传递,A依赖了B,B依赖了C,那么A的依赖中就会出现B和C。(依赖传递性)
  3. Maven对同一个groupId, artifactId的冲突仲裁,不是以version越大越保留,而是依赖路径越短越优先,然后进行保留。(最短路径),
  4. 依赖的scope会影响依赖的影响范围的.
  5. 子pom依赖会优先与父pom.

两个原则:①:最短路径优先。②:相同路径时先声明优先依赖

附:IDEA自动下载文档和源码配置:

      ①:Ctrl+Alt+S

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_23

     ②:项目里面如何下载文档和源码如下:

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven依赖工程打包自动修改名称_24

     ③:如何项目中下载的源码类查看文档

     Ctrl+Q

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_maven_25

     ④:查看源代码:

    按住Ctrl键,然后鼠标左键即可看到

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_26

附录:IDEA拉取https仓库跳过证书校验

一般大型项目,内网多Maven仓库基本都是https的二方仓库,不同的组件会发布到一些公司自研的仓库中,这个时候就需要在构建脚本中跳过https的校验,mvn clean package -gs settings.xml

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_27

【解决Maven大型项目导入内网二方包,飘红问题,一般来说就是Maven的缓存所致,清楚一下重新编译,Https构建速度比较快】 

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_28

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_java_29

 另外一点,如果是项目目录下的settings的更新后还是拉取jar包失败,这个时候可能删除一下settings的文件,再重新添加一下即可,Maven缓存所致.

【排除一些低版本的依赖包,然后在pom中高版本的包,注意新旧特性是否兼容】,或者是直接升级三方依赖包.

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_30

查找依赖方式

Ctrl+F 

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_31

依赖分析命令:

mvn dependency:tree -Dverbose -Dincludes=snappy-java

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_intellij-idea_32

mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>(指定依赖的冲突)

mvn -X compile dependency:tree -Dverbose >a.log(分析指定的依赖关系并重定向至文件中)

mvn -U clean package -Dmaven.test.skip=true enforcer:enforce -DcheckDeployRelease_skip=true -Denforcer.skip=false(打包跳过测试)

mvn dependency:tree -Dverbose(分析项目中所有jar冲突)

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_33

mvn dependency:tree -Dverbose |grep "omitted for duplicate" 【Linux】

windows下查询冲突. 

mvn dependency:tree -Dverbose |find "omitted for duplicate"【Windows】

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_34

新版IDEA推荐升级情况 

maven依赖工程打包自动修改名称 maven包依赖冲突怎么解决_依赖包_35