一、什么是Maven
Maven是基于 POM(工程对象模型),通过一小段描述来对项目的代码、报告、文件进管理的一个跨平台的项目管理工具。Maven主要有两大功能:管理依赖、项目构建。
二、Maven的安装配置
下载
http://maven.apache.org/download.cgi
安装过程直接解压即可
配置环境变量
然后在Path中添加 %MAVEN_HOME%\bin
测试
在命令行窗口输入:mvn -v 或 mvn -version
配置Maven
1、全局配置
在 Maven 安装目录的 conf 里面有一个 settings.xml 文件,这个文件就是 Maven 的全局配置文件。settings.xml文件中设置包含本地仓库路径、远程仓库服务器地址等配置信息。
2、用户配置
用户配置文件的地址:~/.m2/settings.xml,该文件默认没有,需要将全局配置文件拷贝一份到该目录下。如果用户配置文件不存在,则使用全局配置文件的配置。
三、Maven 命令
Maven 命令要在 pom.xml 所在目录中去执行
- mvn compile
- 编译;
- 完成编译后,会生成target目录,该目录中存放了编译后的字节码文件;
- mvn clean
- 清除命令,清除已经编译好的class文件,具体说清除的是target目录中的文件;
- 执行完毕后,会将target目录删除;
- mvn test
- 测试命令,该命令会将test目录中的源码进行编译;
- 执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件);
- mvn package
- 打包;
- 执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war;
- mvn install
- 安装命令,会将打好的jar包发布到本地仓库;
- 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用;
- mvn clean compile
- 组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类;
- mvn clean test
- 组合指令,先执行clean,再执行test,通常应用于测试环节;
- mvn clean package
- 先执行 clean,再执行 package,将项目打包,通常应用于发布前;
- mvn clean install
- 先执行clean,再执行install,将项目打包然后发布到本地仓库当中;
四、Maven的核心概念
1、坐标
在 Maven 中,坐标的作用就是定位一个唯一确定的 jar 包。Maven世界拥有大量构建,通过坐标,我们就能从 Maven 仓库中引用指定的 jar 包进行构建。
Maven 坐标的组成
- groupId:定义当前Maven的组名
- artifactId:定义当前项目名称
- version:定义当前项目的版本
2、依赖管理
依赖范围
依赖范围用 scope 标签来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
- compile:默认编译依赖范围,对于编译、测试、运行三种 classpath 都有效;
- test:测试依赖范围,只对于测试 classpath 有效;
- provided:已提供依赖范围,对于编译、测试的 classpath 都有效,但对于运行无效。例如:由于容器已经提供,所以运行时不需要,如 servlet-api;
- runtime:运行时依赖范围,例如:jdbc驱动;
依赖传递
某项目工程下有A、B、C三个模块,B模块依赖A模块,C模块依赖B模块,那么B模块是C模块的直接依赖,A模块是C模块的间接依赖。也就是说:
- C直接依赖B
- C间接依赖A
我们分别在C模块和B模块的 pom.xml 文件中加入如下配置:
<dependencies> <dependency> <groupId>com.test.maven</groupId> <artifactId>B</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
<dependencies> <dependency> <groupId>com.test.maven</groupId> <artifactId>A</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
从上图可以看出,虽然C没有直接依赖于A,但是通过简介依赖,C也可以调用A中的类和方法;
然后我们在A模块的 pom.xml 文件中引入 Junit4.12,如下:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies>
可以看到:当 scope 标签中的值为 compile 时,直接依赖和间接依赖的模块都能使用。
总结:
- 当A范围是compile的时候,B和C能够使用。
- 当A的范围是test的时候,B和C不能使用。
- 当A的范围是provided的时候,B和C不能使用;
- 当A的范围是runtime的时候,B和C能够使用;
依赖冲突
跨 Pom 文件的冲突
A模块的 Pom文件中依赖了 Junit 4.12版本,而B模块的 Pom文件中依赖了Junit 4.10版本,那么B 和 C都将使用 Junit 4.10版本,如下图:
同一个 Pom 文件的冲突
B模块的 Pom文件中依赖了Junit 4.10 和 Junit 4.12两个版本,则以放在下面的版本为准,就近原则。
可选依赖
Optional标签标示该依赖是否可选,默认是false,表示该依赖会传递下去,如果为true,则表示不会传递下去。
排除依赖
在 C模块的 Pom 文件中加入 Exclusions 标签排除 Junit 依赖
3、继承
如果所有模块都需要用到某个 jar 包,我们只需要在工程那一级别的 Pom文件中设置即可。
把 A、B、C的依赖关系去掉,统一在工程的 Pom文件进行 jar 包的依赖设置,该工程下的所有模块都能使用该 jar包了。
五、Maven 仓库
什么是 Maven仓库
用来统一存储所有Maven共享构建的位置就是仓库。根据Maven坐标定义每个构建在仓库中唯一存储路径大致为:groupId/artifactId/version/artifactId-version.packaging;
仓库的分类
- 本地仓库
- 默认地址:~/.m2/repository;
- 每个用户只有一个本地仓库
- 远程仓库
- 中央仓库:Maven默认的远程仓库,不包含版权资源
- 私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
- https://maven.aliyun.com/nexus/content/groups/public/(阿里云)
- 个人和公司也可以自己搭建私服;
六、远程仓库配置介绍
1、中央仓库
2、本地私服