一.前言
1.介绍
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理,现为由 Apache 软件基金会主持的独立 Apache 项目。
构建:通过maven命令可以完成项目从清理、编译、测试、打包、部署
依赖管理:对jar包的管理
2.常用命令
清理:clean
编译:compile
测试:test
打包:package
安装:install
3.坐标范例
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
4.特点
- 项目设置遵循统一的规则;
- 任意工程中共享;
- 依赖管理包括自动更新;
- 一个庞大且不断增长的库;
- 可扩展,能够轻松编写 Java 或脚本语言的插件。
二.依赖传递
2.1依赖传递
在Maven中依赖是可以传递的,道理如同假如有三个项目A,B,C。A依赖B,B依赖C,那么A也依赖C。
在pom文件中
项目中依赖了dubbo,而dubbo依赖了gson,那么就相当于项目中也依赖了gson,可以使用gson jar包。
2.2依赖冲突
由于有依赖传递现象的存在,会导致项目中不同依赖分别又依赖了不同版本的相同jar,这就造成了依赖冲突
解决:
1.使用maven提供的依赖调解原则
第一声明者优先原则
路径近者优先原则
2.排除依赖
3.锁定版本
查看依赖冲突
我使用的是intellij idea,安装maven helper插件,在要查看的pom.xml文件中有个Dependency Analyzer
左边为依赖冲突的jar,右边是具体信息
- Conflicts(冲突)
- All Dependencies as List(以列表形式查看所有依赖)
- All Dependencies as Tree(以树形式查看所有依赖)
1.第一声明者优先原则
在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。
比如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
在依赖中会优先使用spring-context中的依赖版本
假如我们将pom依赖交换下位置
再查看maven helper插件显示
可以看出来目前使用的是5.2.0的版本
2.路径近者优先原则
即直接依赖级别高于传递依赖。我们直接在pom中依赖spring-core 5.2.0.RELEASE版本
可以看出来直接使用的是就近的5.2.0版本
3.排除依赖
可以使用exclusions标签将传递过来的依赖排除出去
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
可以看到spring-aop中不会依赖spring-core了,而是使用spring-context中的spring-core5.2.7版本的
4.锁定版本
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。
版本锁定的步骤:
步骤一:在dependencyManagement标签中锁定依赖的版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
步骤二:在dependencies标签中声明需要导入的maven坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
pom文件中使用dependencyManagement标签进行版本锁定,并不会真正将jar包导入到项目中,只是对这些jar的版本进行锁定,项目中使用哪些jar包,还需要在dependencies标签中进行声明
三.maven工程的继承
3.1继承
在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。
被继承的maven项目中pom的部分
<artifactId>maven</artifactId>
<groupId>org.example.parent</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
继承的maven项目中的pom的部分,只贴出parent中的部分
<parent>
<artifactId>maven</artifactId>
<groupId>org.example.parent</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
3.2 聚合
在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作
<modules>
<module>parent</module>
<module>son</module>
</modules>
四.总结
本文主要介绍了maven操作过程中的部分内容,包括maven的常用命令,依赖传递,依赖冲突的产生和解决,maven工程的继承和聚合,不足之处可以一起讨论。