Maven介绍
Maven 是 Apache 软件基金会唯一维护的一款自动化构建工具,专注于服务Java平台的项目构建和依赖管理。
1.Maven是如何寻找依赖的?
首先会去本地仓库寻找,然后会去公司的私服仓库寻找,一般私服仓库存的都是公司自己开发的 jar 包,最后会去 由Apache 团队来维护中央仓库寻找,一旦在一个地方找到就不再寻找。
2.在我们项目中具有众多依赖,程序是如何确定这个依赖的位置呢
通常情况下,我们利用 groupId、artifactId、version 标签来确认这个依赖的唯一坐标
<groupId>:企业网址反写+项目名
<artifactId>:项目名-模块名
<version>:当前版本
<groupId>com.juejin.business</groupId>
<artifactId>juejin-image-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
3.scope 标签在我们的项目中经常使用到,你知道常见的范围有哪些吗?
- compile:默认范围,编译、测试、运行都有效
- provided:编译和测试有效,最后运行不会被加入,如tomcat依赖
- runtime:在测试和运行的时候有效,编译不会被加入,比如jdbc驱动jar
- test:测试阶段有效,比如junit
- system:与provided一致,编译和测试阶段有效,但与系统关联,可移植性差
- import:导入的范围,它只是用在dependencyManagement中,表示从其它的pom中导入dependency的配置
4.Maven的生命周期
clean 移除所有上一次构建生成的文件
validate:验证工程是否正确,所有需要的资源是否可用
compile:编译项目的源代码
test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
package:把已编译的代码打包成可发布的格式,比如 jar、war 等。
verify:运行所有检查,验证包是否有效且达到质量标准。
install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用
site 生成项目的站点文档
deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享
4.解决Maven依赖冲突
这个红色波浪线是因为依赖冲突,你看你的 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项目依赖
<dependency>
<groupId>com.juejin.business</groupId>
<artifactId>juejin-image-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.juejin.business</groupId>
<artifactId>juejin-convert-web</artifactId>
</exclusion>
</exclusions>
</dependency>
(2). 通过optional实现
<dependency>
<groupId>com.juejin.business</groupId>
<artifactId>juejin-convert-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<optional>true</optional>
</dependency>