目录
1.为什么要学习Maven
1. 作为jar包的管理工具
2.作为构建管理工具
3.结论
2.什么是Maven
1. 构建包含的主要环节
2.依赖
3.Maven的工作机制
3.Maven的核心概念:
1.坐标
2.POM
3.约定的目录结构
4.生命周期
5.插件与目标
6.仓库
4.Maven操作
5.依赖
1.依赖的范围
2.依赖的传递
3.依赖的排除
6.继承
7.聚合
8.使用idea操作Maven
1.为什么要学习Maven
1. 作为jar包的管理工具
* 项目中用到的jar包数量越来越大,比如使用框架中的三个功能,就需要导入106个jar包;使用Maven则只需要导入三个依赖而已
* jar包的来源十分难找,找到的也不一定能用;使用Maven后,依赖对应的jar包能够自动下载,方便且规范
* 框架中的jar包数量庞大,且具有复杂的依赖关系,彼此盘根错节,在使用中难度很大。使用Maven可以很好的管理jar包
2.作为构建管理工具
* 在使用java/web源程序(比如java的类)时,都需要将源程序加载、打包、部署,这就是构建。使用IDEA开发时,构建由IDEA生成
* 将代码写好要上传到服务器中,需要将代码集成、打成war包、部署,此时IDEA无法替我们构建,Maven可以
3.结论
* 管理规模庞大的jar包,需要专门工具
* 脱离IDE环境执行构建操作,需要工具
2.什么是Maven
1. 构建包含的主要环节
* 清理:删除上一次构建的结果,为下一次构建做好准备
* 编译:Java源程序编译成*.class字节码文件
* 测试:运行提前准备好的测试程序
* 报告:针对刚才测试的结果生成一个全面的信息
* 打包:Java工程:jar包;Web工程:war包
* 安装:把一个Maven工程经过打包操作生成的jar包或war包存入到Maven仓库
* 部署:部署jar包:把一个jar包部署到Nexus私服服务器上;
部署war包:借助相关Maven插件(例如cargo),将war部署到Tomcat服务器上
2.依赖
* 如果A工程里面用到了B工程的类、接口、配置文件等等这样的资源,那么我们就可以说A依赖B
- 依赖中要解决的具体问题:
* jar包的下载:使用Maven之后,jar包会从规范的远程仓库下载到本地
* jar包之间的依赖:通过依赖的传递性自动完成
* jar包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
3.Maven的工作机制
3.Maven的核心概念:
1.坐标
坐标:使用三个向量在Maven仓库中唯一的定位到一个jar包
* groupId:公司或组织的ID
* artifactId:一个项目或者是项目中的一个模块的ID
* version:版本号
* 一个项目,可能有很多模块,因此存在很多个工程
比如:
groupId:com.gz.maven
artifactId:pro01-gz-maven
version:1.0-SNAPSHOT
2.POM
* POM:project object model-项目对象模型
* 模型化思想:将工程抽象成一个模型,再用程序中的对象来描述这个模型;就是将现实生活中的事物抽象成模型,然后封装模型相关的数据作为一个对象。比如:地球-地球仪
* 对应的配置文件:POM理念体现在Maven根目录下pom.xml文件中。学习Maven就是学习如何配置pom.xml文件
3.约定的目录结构
* 约定目录结构的意义:Maven为了让构建过程尽可能自动化完成,必须约定目录结构的作用
* 约定大于配置,配置大于编码:Maven对于目录结构,是基于约定的,使得开发非常方便
4.生命周期
* Maven包中的Lifecycle既是生命周期
* 作用:让构建过程自动化完成,Maven设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作
* 简单的说:在生命周期的任一个环节执行都会从头开始执行
* 三个生命周期:
1. Clean:清理操作相关
2. Site:生成站点相关:将Maven项目的依赖等各种信息抽取出来,生成一组静态页面-站点
3. Default:主要构建过程
* deploy-部署:将包复制到远程的仓库,以让其他开发人员与项目共享;或部署到服务器上运行(借助插件,如cargo)
5.插件与目标
* 插件:Maven的核心程序仅仅负责宏观调度,不做具体工作。具体工作由Maven插件完成
* 目标:一个插件可以对应多个目标,每一个目标都个生命周期的某一个环节对应
6.仓库
* 本地仓库:在当前电脑上,为电脑所有工程服务
- 远程仓库:需要联网
* 局域网:我们自己搭建的Maven私服,比如使用Nexus技术搭建私服
* nezus相当于是一个中转站,当需要的jar包本地没有时,会先去Nexus私服看有没有,私服没有就由私服去中央仓库下载jar包,然后本地再从私服中下载
* internet-外网:中央仓库/镜像仓库
* 建议不要中央仓库和阿里云镜像混用,否则jar包来源不纯,彼此冲突
4.Maven操作
* 使用命令生成Maven工程:运行 mvn archetype:generate命令
* 使用命令行执行Maven命令时,要在pom.xml所在目录下运行—操作哪个工程,就进入这个工程的pom.xml目录
* 清理:mvn clean
* 编译:主程序编译:mvn compile;测试程序编译:mvn test-compile;主体程序编译结果存放目录:target/classes测试程序编译结果存放目录:target/test-classes
* 测试:mvn test;测试报告存放目录:target/surefire-reports
* 打包:mvn package;打包为jar包,存放目录:target
* 安装:mvn install
* 只有web工程依赖java工程,没有java工程依赖web工程
5.依赖
1.依赖的范围
* 部署到服务器:就是打包的过程中
* compile、test、provided都是scope中的范围;该写一定要写,不然易引起冲突(比如服务器中有一个jar包,你不应该部署到服务器中,此时scope为provided,但你使用了compile,就会报错)
* 但这些scope一般复制过来时都已经有了,不要删掉就行
2.依赖的传递
* A依赖B,B依赖C,在A没有配置对C的依赖时,A能否使用C的依赖,取决于B依赖C的依赖范围
* B依赖C使用compile范围时,可以传递
* B依赖C使用test/provided时:不能传递,因此需要这样的jar包时,必须在需要的地方明确配置依赖才可以
3.依赖的排除
* 即阻断依赖的传递;避免出现jar包之间的冲突(传递时导入同一个jar包的不同版本)
* 排除方式:exclusions-排除
6.继承
* 含义:A工程的pom.xml中的配置继承了B工程中pom.xml的配置;B即为父工程
* 作用:可以统一管理项目的依赖信息,具体来说是管理依赖信息的版本,保持版本一致
* 只有打包方式为pom的Maven工程能够管理其他Maven工程。即作为父类
* 打包方式为pom的Maven工程不写业务代码,是专门管理其他Maven工程的工程
* 子工程的groupId和version如果和父工程一样,则可以省略,只保留artifactId
* 在父工程中统一管理依赖信息
* 注意:即使在父工程配置了对依赖的管理,子工程需要使用具体哪一个依赖还是要明确配置,只是不需要写版本号
* 想要一处修改,处处生效,可以在properties里面配置自定义的属性标签
7.聚合
* 即部分组成整体
* 项目:整体;模块:部分
* 从聚合关系来讲:总工程、模块工程
* 先安装父工程,然后按照被依赖工程,最后安装本工程
* 要避免依赖循环问题
8.使用idea操作Maven
* 重中之重:idea版本要和Maven匹配,比如idea2019只能匹配maven3.6以下的
1.Maven home directory:下载的Maven压缩包位置
User settings file:下载的Maven压缩包中setting.xml文件位置,在conf下
Local repository:自己在电脑中设置的本地仓库
2.在IDEA的右侧是Maven的快捷操作界面
Lifecycle:表示生命周期中的各个操作,比如点击clean相当于:清理-mvn clean
Pugins:表示各种插件
Dependencies:已经导入的依赖