Maven是一个java项目管理和构建工具,它可以定义项目结构,项目依赖,并使用统一的方式进行自动化构建,是java项目不可缺少的工具
为什么学Maven
提供了一套标准化的项目结构
不同开发工具创建的项目结构不一样,maven规范了项目的结构,开发人员上手更简单。
提供一套依赖管理机制。(管理项目的所有jar包)。
如果jar包很多的话,体积就会很大,占用磁盘多,传输慢,maven利用仓库统一管理了所有的jar包
利用依赖传递的特性把相关的jar包引入进来,解决了jar包版本冲突问题
下载安装maven
maven是一个java工具,使用它必须依赖java环境,可以去maven官网下载maven,安装配置参考官方文档
下载地址:https://maven.apache.org/download.cgi
下载比较慢,用梯子好像才能进官网
配置jar仓库地址
配置镜像网址
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo2.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
</mirrors>
2配置环境变量
根据个人maven下载地址来配置环境变量
添加path环境变量
注意图片里MAVEN写成了MAVE
配置环境变量规律:XXX_HOME真的是bin目录的上一级 PATH指的是bin目录
检测是否成功配置了maven环境
创建maven项目
mvn archetype:generate
两种方法
1.通过指令创建
第一次使用该指令会自动下载需要文件
利用编译工具生成
其实重要学习的就是pom文件配置信息
坐标
通过坐标引用jar包:依赖
***通过在pom添加文件里添加dependencies,可以去中央仓库寻找需要的依赖的dependency,网址:https://mvnrepository.com/
properties
test测试
在test文件夹下添加测试用例,使用maven执行test指令,则会自动执行测试用例的结果,测试用例的类名要以Test开头
install指令
通过install指令,可以把写好的框架打包成jar包,放在本地仓库,后续可以通过本地仓库引入该依赖。
package
package在打包前会执行一系列指令,包括test
scope放在dependency下,用于表示该引用的依赖在什么范围内生效
比如下面图片表示webcam-capture在测试的时候才生效,但是其他时候(包括编译运行,打包)用不了
scope一般只是建议,即使都设置为compile也没太大影响,并且中央仓库提供了scope范围,可以无脑复制,但是作为追求优雅代码主义者,可以仔细考虑范围
依赖传递
当引用了一个jar包,那么就会同时引用了该jar包引用的jar包,这就叫做传递依赖
除了使用scope来限制子jar包引用的范围,也可以使用<optional>来限制jar包生效范围,在引用的jar包里的某个jar包dependency下添加<optional>true</optional>可以取消该jar包的出传递依赖,默认是false代表会传递
当然有许多依赖不归我们管理,所以控制不了jar包的scope,但是我们可以通过exclusions来取消该依赖下的某些jar包,或者可以说是依赖。
以上图片代表了排除了com.mys-j下的mysql-connector的依赖
除了以上方法,还可以通过覆盖的方式来覆盖不想要的依赖版本:
当不知道某些jar包来源于哪个文件时可以通过Show Diagram来显示jar包结构
聚合工程
1.创建一个项目假设其名为parent,把src删除
2.在parent文件下创建模块,假设创建两个模块分别为前端frontend和后端backend
3.修改parent下pom文件的package为pom
4.添加modules,分别为frontend和backend
5.可以不需要通过install添加到仓库里,frontend和backend都可以直接使用坐标引用
maven继承
有时候我们需要统一管理所有模块使用统一版本,这时候就需要parent父类的pom管理,我们可以自己配置parent,也可以例如下图选中parent模式。
下面是如何配置parent来达到统一管理所有模块
1.删除所有子模块pom文件的groupId和artifactId,在所有子模块pom文件下添加parent,包含父类的groupId和artifactId和version,同时删除原有的groupId和version
2.在父类下添加dependency模块可以为子模块引用依赖
3.在父类下pom添加denpendencyManagement可以,默认不会添加到子模块下依赖,但是可以通过子模块的pom文件添加dependency来添加模块,但是不需要version版本号了,因为父类给了版本号。
dependecies结构:
dependencyManagement结构: