一、Maven坐标的含义
Maven的坐标用于描述仓库中资源的位置。
Maven 坐标主要组成
groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itboy)
artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
version:定义当前项目版本号,其中SNAPSHO表示开发中的版本,release表示发布的版本
二、标准maven项目的结构
2.1、标准maven项目的结构
标准Maven项目的结构是在src目录下同时存在main文件夹和test文件夹,其中在main和test文件夹下又同时存在java包和resources包
2.2、手动设置java包和resources 
三、依赖传递和依赖冲突
3.1、依赖传递
我们在project1中引入了project2,这样就会把project2中所有的依赖都引入到project1中,我们称为依赖传递。
但是现在project1和project2同时引入了junit,并且版本还不一样,此时就会造成依赖冲突,
根据依赖层级关系,我们可以看到project1中是以自身的junit版本为标准。依赖层级下面有介绍。
所以凡是项目中引入了其他项目的依赖,都会把其他项目的所有依赖导入到本项目,遇到相同jar包时,以本项目的版本为准。
3.2、直接依赖和间接依赖
这种在maven的pom.xml直接引入的依赖我们称为直接依赖,可以把依赖层级看为1级
3.3、间接依赖
org.hamcrest:hamcrest-core:1.3jar包是通过junit依赖传递引入的,我们称为间接依赖,并且可以它的依赖层级看为2级。
四、Maven的常用命令
4.1、maven插件的作用
maven会内置clean、compile、install等插件,这些插件在创建好maven项目就会存在,不用额外手动创建,这些插件是用来执行maven对应生命周期的。
maven的常用命令有:compile(编译)、clean(清理)、test(测试)、package(打包)、install(安装)。
4.2、compile(编译)
compile(编译)的作用有如下两点:
1、从阿里云下载编译需要的jar包,在本地仓库也能看到下载好的插件(远程仓库配置的是阿里云就会从阿里云下载)。
2、主要作用是第2点,会在项目下生成一个 target 目录,并将src/main/java下的源文件编译为class文件输出到target目录下。
4.3、clean(清理)
clean(清理)的作用有如下两点:
- 从阿里云下载清理需要的jar包。(compile是下载编译需要的jar包,clean是下载清理需要的jar包)
- 删除项目下的 target 目录。(删除1.1中通过compile生成的target目录)
4.4、package(打包)
package(打包)的作用有如下两点:
- 从阿里云下载打包需要的jar包。
- 将当前项目打成jar包,并保存到target 目录下。本地的target目录也会保存这个jar包。
项目中target目录下的jar包
本地的target目录下的jar包
注意:执行package命令首先会去执行compile命令,可以看见“项目中target目录下的jar包”这个图片中target目录下生成了classes文件夹,说明生成了class文件。
4.5、install(安装)
install(安装)的作用有如下两点:
1、从阿里云下载安装需要的jar包。
2、将当前项目打成jar包,并保存到target 目录下。本地的target目录也会保存这个jar包。同时会保存到本地仓库。
与命令package的唯一区别就是会保存到本地仓库。
注意:
- 执行install命令首先会去执行compile命令,再去执行package命令,最后再去执行install命令。
- 使用clean清除命令只会清除target目录,所以使用install命令在本地仓库生成的jar包并不会清除。
五、Maven 生命周期
同一套生命周期内,执行后边的命令,前面的所有命令会自动执行。例如默认(default)生命周期如下:
当我们执行 install(安装)命令时,它会先执行compile命令,再执行 test 命令,再执行package命令,最后执行 install 命令。
当我们执行package (打包)命令时,它会先执行 compile 命令,再执行 test 命令,最后执行 package 命令。
六、 maven的聚合工程
6.1、dependencyManagement标签的作用
聚合工程一般又是父工程,起着统一管理项目版本的作用,聚合工程不参与打包操作,所以<packaging>pom</packaging>中设置为pom,其中modules标签里面设置了管理的子工程。
dependencyManagement标签里面的依赖不会被子模块强制下载,子模块需要依赖还是要在子模块中导入依赖。
dependencyManagement标签配合properties标签可以控制依赖的版本
6.2、plugins标签的作用
plugins标签就是用来下载相关插件的,如果在父模块中下载了相应标签,会被继承到子模块中
七、 子模块中的继承
有父模块中的聚合,就有子模块中的继承,二者是相辅相成的。
parent标签中可以指定父模块的信息,然后自身的标签中可以去除对应的groupId和version
因为需要和父模块保持一致
并且这里没有指定<packaging></packaging>标签,默认就是打jar包。
使用聚合模块和子模块的继承实际上就是保持版本的一致性,不要想那么复杂!
子模块中引入了依赖后不用去标注父模块中已经指定了版本号的依赖
继承项目和直接引入其他项目的区别
A模块继承了B模块并且直接依赖C模块之间的区别:
A模块继承了B模块,所以B模块是A模块的父模块,B模块对依赖起着版本控制的作用
A模块直接依赖C模块,那么C模块所有的依赖都会被导入到A模块中,C中有A种没有的依赖没有版本冲突,A中有C中也有的依赖,按照依赖层级以A模块的为准
八、resources标签的作用
build标签下面的resources标签是对资源文件的控制,假设package.environment=dev
下面就是对src/main/resources/dev文件夹下面的文件进行的操作
九、profiles标签的作用
Profiles标签是用来指定环境的,可以看见Profiles标签里面的环境和右边maven里面的内容相对应
其中activeByDefault标签用来指定对应的环境,下面表示指定dev环境