Maven依赖冲突解决

 Maven介绍

        Maven 是 Apache 软件基金会唯一维护的一款自动化构建工具,专注于服务Java平台的项目构建和依赖管理。

1.Maven是如何寻找依赖的?

        首先会去本地仓库寻找,然后会去公司的私服仓库寻找,一般私服仓库存的都是公司自己开发的 jar 包,最后会去 由Apache 团队来维护中央仓库寻找,一旦在一个地方找到就不再寻找。 

2.在我们项目中具有众多依赖,程序是如何确定这个依赖的位置呢 

        通常情况下,我们利用 groupIdartifactIdversion 标签来确认这个依赖的唯一坐标 

:企业网址反写+项目名
:项目名-模块名
:当前版本

com.juejin.business
juejin-image-web
1.0.0-SNAPSHOT

3.scope 标签在我们的项目中经常使用到,你知道常见的范围有哪些吗? 

  • compile:默认范围,编译、测试、运行都有效
  • provided:编译和测试有效,最后运行不会被加入,如tomcat依赖
  • runtime:在测试和运行的时候有效,编译不会被加入,比如jdbc驱动jar
  • test:测试阶段有效,比如junit
  • system:与provided一致,编译和测试阶段有效,但与系统关联,可移植性差
  • import:导入的范围,它只是用在dependencyManagement中,表示从其它的pom中导入dependency的配置

4.Maven的生命周期

Maven依赖冲突解决_第1张图片 

clean 移除所有上一次构建生成的文件
validate:验证工程是否正确,所有需要的资源是否可用
compile:编译项目的源代码
test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
package:把已编译的代码打包成可发布的格式,比如 jar、war 等。
verify:运行所有检查,验证包是否有效且达到质量标准。
install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用
site 生成项目的站点文档
deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享

 4.解决Maven依赖冲突

Maven依赖冲突解决_第2张图片 

        这个红色波浪线是因为依赖冲突,你看你的 fastjson 这个包,是不是显示 omitted for conflict with 1.2.47,这个意思就是你的 fastjson 包产生了冲突。我换个说法给你解释,就比如说你的项目中用了 A jar 包依赖 C jar 包, B jar 包也依赖 C jar包,Maven 就帮你下载了两个版本的 C jar 包,然后他们就产生了依赖冲突,这时Maven会依据依赖路径最短优先原则,来决定使用哪个版本的 jar 包,而另一个无用的jar包则未被使用,这就是所谓的依赖冲突。”

        在大多数情况下,jar 包冲突是不会影响我们系统正常的运行的,但是不排除在一些极端的情景下会出现找不到类的异常 ,我们作为一名严谨的程序员(为了 KPI 考虑),一定要把这个问题解决掉

         (1).通过 exclusions 标签实现。冲突项目依赖 juejin-image-web项目的时候,主动排除传递的juejin-convert-web项目依赖

 
        com.juejin.business
        juejin-image-web
        1.0.0-SNAPSHOT
        
            
                com.juejin.business
                juejin-convert-web
            
        
    

(2). 通过optional实现


        com.juejin.business
        juejin-convert-web
        1.0.0-SNAPSHOT
        true
 

 

 

你可能感兴趣的:(maven,java)