Maven笔记之核心概念及常用命令
Maven的核心概念
Maven是一款服务于java平台的自动化构建工具。
自动化构建工具还有:make->ant->maven->gradle
1.约定的目录
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201214215217394-1542417452.png)
2.POM Project Object Model pom.xml是核心配置文件,与构建相关的一切都在里面设置
3.坐标 下面三个向量唯一定位一个Maven工程
groupId:公司或组织域名倒序+项目名
artifactId:模块名
version:版本号
Maven工程的坐标与仓库中路劲的关系:groupId + artifactId + version + jar名(groupId和artifictId中的点需要替换为斜杠,类似于java中包的写法为 java.lang.String,但实际路劲写法为java/lang/String)
4.依赖
<dependency> <groupId>com.study</groupId> <artifactId>xxx</artifactId> <scope>compile</scope> </dependency>
Maven解析依赖时会到本地仓库去查找依赖的jar包,对于我们自己开发的Maven工程,使用mvn install后就能进入仓库。
依赖的范围(在scope中设置)
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201215232039010-1795267099.png)
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201215232241044-1903993595.png)
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201215232213418-2061162389.png)
[1]compiled (默认)
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:参与
[2]test
对主程序是否有效:无效
对测试程序是否有效:有效
是否参与打包:不参与
[3]provided
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
依赖的特性:
①依赖的传递性
[1]好处:可以传递的依赖不必在每个模块中重复申明,在“最下面”的工程中依赖一次即可
[2]注意:非compile范围的依赖不能传递。所以在各个模块中,如果有需要就得重复申明依赖。
②依赖的排除
[1]需要设置依赖排除的场合
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201216193154563-1983724512.png)
[2]依赖排除的设置方式(只对配置的工程及后面依赖该工程的生效)
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201216193552552-1698137234.png)
③依赖的原则
[1]作用:解决模块工程之间jar包的冲突
[2]情景设定1:验证最短路径优选原则
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201216194244068-766682442.png)
[3]情景设定2:验证最短路径相同先声明原则(dependecy标签申明的顺序)
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201216194357214-438170641.png)
④统一管理依赖的版本
[1]情景举例
![](https://img2020.cnblogs.com/blog/1107110/202012/1107110-20201216194726337-211160643.png)
这里对spring各个jar包的依赖版本都是4.0.0如果想统一升级为4.1.1。
[2]建议配置方式
i:使用properties标签内使用自定义标签统一申明版本号
<properties> <myVersion>4.1.1<myVersion> <properties>
ii:在需要统一版本的位置,使用${自定义标签名}引用申明的版本号
<version>${myVersion}<version>
[3]其实properties标签配合自定义标签申明数据的配置并不是只能应用于声明依赖的版本号,凡是需要统一声明再引用的场合都可以使用。
5.仓库
仓库分类
[1]本地仓库:为当前电脑上所有的Maven工程服务
[2]远程仓库
(1)私服:架设在当前局域网环境下,为当前局域网下所有Maven工程服务
(2)中央仓库:架设在Internet上,为全世界所有Maven工程服务
(3)中央仓库镜像:架设在各个大洲,为中央仓库分担流量。提升用户访问速度。
仓库中保存的内容:Maven工程
[1]Maven自身所需要的插件
[2]第三方框架或工具的jar包
[3]我们自己开发的Maven工程
6.生命周期/插件/目标
①各个构建环节执行的顺序:不能打乱顺序,必须按既定的顺序执行。
②Maven的核心程序中定义了抽象的生命周期,生命周期中的各个阶段的具体任务由插件完成。
③Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期的各个阶段:不论现在要执行生命周期中的哪个阶段,都是从生命周期最初的位置开始执行。
7.聚合
[1]作用:一键安装各个工程。
[2]配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块
<!--配置聚合--> <modules> <!--指定各个子工程的相对路径--> <module></module> <module></module> </modules>
[3]使用方式:在聚合工程上执行安装
8.继承
[1]问题:模块之前版本不一致(由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本的不一致)
[2]需求:统一管理各个模块工程中对junit依赖的版本
[3]解决思路:将junit依赖统一提取到“父工程”中,在“子工程”中声明依赖时不指定版本
[4]操作步骤:
①创建一个maven工程作为父工程。注意:打包的方式需为pom
<groupId>org.example</groupId> <artifactId>mavenStudy</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
②在子工程中声明对父工程的引用
<!-- 子工程中声明父工程--> <parent> <artifactId></artifactId> <groupId></groupId> <version></version> <!--以当前项目为基准的父工程pom.xml文件的相对路径--> <relativePath></relativePath> </parent>
③将子工程坐标中与父工程坐标中重复的内容删掉
④在父工程中统一junit的依赖
<!--配置依赖的管理--> <dependencyManagement> <dependencies> <dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <scope></scope> </dependency> </dependencies> </dependencyManagement>
⑤在子工程中删除junit依赖的版本号
[5]注意:配置继承后,执行安装命令需要先安装父工程。
常用maven命令
执行与构建过程(编译,测试,打包)相关的命令必须进入pom.xml所在位置执行
mvn clean:清理(打包好的程序放在生成的名为target的文件中,清理即删除文件中打包好的程序)
mvn compile:编译主程序
mvn test-compile:编译测试程序
mvn test:执行测试
mvn package:打包
mvn install:安装至本地仓库
mvn site:生成站点
修改默认本地仓库的位置:在conf/settings.xml中修改localRespository标签