Maven学习笔记
一、为什么使用maven
- 项目过大,不适合继续使用package来去划分模块,最好一个模块对应一个工程,借助Maven就可以将一个项目分成几个工程
- 同样的jar包文件重复出现在不同的项目工程中,浪费存储空间,工程臃肿,借助Maven,将jar包仅仅保存在“仓库”中有需要使用的工程“引用”这个文件的接口,并不需要吧jar包复制过来
- 借助Mavev可以以一种规范的方式下载jar包,所有的知名框架或第三方工具的jar包以及按照统一的规范存放在Maven的中央仓库中
- Maven会自动将被依赖的jar包导入进来
二、Maven是什么
1、Maven是一款服务于java平台的自动化构建工具
2、构建过程
(1)清理:将以前编译得到的就得class字节码文件删除,为下一次编译做准备
(2)编译:将java源程序编译成class字节码文件
(3)测试:自动测试,自动调用junit程序
(4)报告:测试程序执行的结果
(5)打包:动态web工程打war包,java工程打jar包,父工程打pom包
(6)安装:Maven特定的概念——将打包得到的文件复制到“仓库”中的指定位置
(7)部署:将动态web工程生成的war包复制到servlet容器的指定目录下,使其可以运行
3、安装Maven核心程序
(1)解压Maven的核心程序的压缩包,放在一个非中文无空格路径下
(2)配置Maven相关的环境变量
(3)验证:运行 mvn -v 命令查看Maven版本
三、Maven的核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
1、约定的目录结构
(1)根目录:工程名
(2)src目录:源码
(3)pom.xml文件:Maven工程的核心配置文件
(4)main目录:存放主程序
(5)test目录:存放测试程序
(6)java目录:存放java元文件
(7)resources目录:存放框架或其他工具的配置文件
2、Maven的常用命令
(1)mvn clean:清理
(2)mvn compile:编译主程序
(3)mvn test-compile :编译测试程序
(4)mvn test :执行测试
(5)mvn package:打包
(6)mvn install:安装
(7)mvn site:生成站点
3、关于联网问题
(1)Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须有特定的插件来完成,而插件本身并不包含在Maven的核心程序中
(2)当我们执行的Maven名利需要用到某些插件时,Maven核心程序会首先到本地仓库中查找
(3)本地仓库的默认位置:【系统只给你当前用户的家目录】\.m2\repository
(4)Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
(5)如果此时无法连接外网,则构建失败
(6)修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
在Maven的解压目录 conf\settings.xml
<localRepository>D:\myManven</localRepository>
4、POM
(1)含义:Project Object Model项目对象模型
(2)pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切设置在这个文件中配置
5、坐标
maven使用三个向量在仓库中唯一定位一个Maven工程
(1)groupid:公司或者组织域名排序+项目名
<groupid>com.xiong.maven</groupid>
(2)artifactid:模块名
<artifactid>hello</artifactid>
(3)version:版本
<version>1.0.0</version>
(4)Maven工程的坐标与仓库中路径的对应关系
6、仓库
(1)仓库库的分类
本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有的Maven工程服务
远程仓库:
①私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务
②中央仓库:架设在Internet上,为全世界所有的Maven工程服务
③中央仓库镜像:为了分担中央仓库的流量,提升用户的方位速度
(2)仓库中保存的内容:Maven工程
①Maven自身所需的插件
②第三方框架或工具的jar包
③我们自己开发的Maven工程
7、依赖
(1)Maven解析依赖信息时会到本地仓库中查找被依赖的jar包
对于我们自己开发的Maven工程,使用mvn install 命令安装后就可以进入仓库
(2)compile范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:参与
- 是否参与部署:参与
- 典型例子:spring-core
(3)test范围依赖
- 对主程序是否有效:有、无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:junit
(4)provided范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:servlet-api.jar
8、Maven生命周期
(1)各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
(2)Maven的核心程序中定义了抽象的生命周期,生命周期的各个阶段的具体人物是由插件来完成的
(3)Maven核心程序为了更好的实现自动化构建,按照这一的特点执行生命周期中的各个阶段:不论现在要执行生命周期的哪一个阶段,都是从这个生命周期最初的位置开始执行
9、依赖(高级)
(1)依赖的传递性
好处:可以传递的依赖不必再每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可
注意:非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要需要重复声明依赖
(2)依赖的排除
(3)依赖的原则
①作用:解决模块工程之间的jar包冲突问题
②路径最短者优先原则
③路径相同时先声明者优先
(4)统一管理依赖的版本
- 使用properties标签内使用自定义标签统一声明版本号
- 需要统一版本的位置,使用${自定义标签名}引用声明的版本号
10、继承
①现状
- Hello依赖junit:4.0
- HelloFriend依赖junit:4.0
- MakeFriends依赖junit:4.9
由于test范围的依赖不能传递,所以必然后分散在各个模块工程中,很容易造成版本不一致
②需求:统一管理各个模块工程中对junit依赖的版本
③解决思路:将junit依赖统一提取到“父”工程中,在子工程中声明junit依赖是不指定版本,以工程中统一设定的为准,同时也便于修改
④操作步骤
【1】创建一个Maven工程为父工程。注意打包的方式pom
【2】在子工程中声明对父工程的引用
【3】将子工程的坐标中与父工程坐标中重复的内容删除
【4】在父工程中统一管理junit的依赖
【5】在子工程中删除junit依赖的版本号部分
注意:配置继承后,执行安装程序命令是要先安装父工程
11、聚合
(1)作用:一键安装各个模块工程
(2)配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块
(3)使用法师:在聚合工程的pom.xml上点击右键—run as —maven install
12、在Eclipse中使用maven
(1)Maven插件:eclipse内置
(2)Maven插件设置
installations :制定Maven核心程序的位置
user settings:制定conf/setting.xml位置,进而获得本地仓库的位置