Maven学习记录
一、Maven的基本概念
Maven(翻译为"专家","内行")是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
1.1、项目构建
项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。
理想的项目构建是高度自动化,跨平台,可重用的组件,标准化的,使用maven就可以帮我们完成上述所说的项目构建过程。
1.2、依赖管理
依赖指的是jar包之间的相互依赖,比如我们搭建一个Struts2的开发框架时,光光有struts2-core-2.3.16.3.jar这个jar包是不行的,struts2-core-2.3.16.3.jar还依赖其它的jar包,依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。
1.3、使用Maven的好处
Maven中使用约定,约定java源代码代码必须放在哪个目录下,编译好的java代码又必须放到哪个目录下,这些目录都有明确的约定。
Maven的每一个动作都拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮我们处理其他事情
使用Maven可以进行项目高度自动化构建,依赖管理(这是使用Maven最大的好处),仓库管理。
二、Maven的核心概念
2.1、什么是坐标?
在平面几何中坐标(x,y)可以标识平面中唯一的一点。
2.2、Maven坐标主要组成
- groupId:组织标识(包名)
- artifactId:项目名称
- version:项目的当前版本
- packaging:项目的打包方式,最为常见的jar和war两种
样例:
2.3、Maven为什么使用坐标?
- Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范。
- 拥有了统一规范,就可以把查找工作交给机器。
三、仓库管理
3.1、Maven仓库
用来统一存储所有Maven共享构建的位置就是仓库
3.2、Maven仓库布局
根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging
3.3、仓库的分类
3.3.1、本地仓库
每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录
3.3.2、远程仓库
1、中央仓库:Maven默认的远程仓库,URL地址:http://search.maven.org/
2、私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
四、聚合
如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合
4.1、聚合配置代码
1 <modules> 2 <module>模块一</module> 3 <module>模块二</module> 4 <module>模块三</module> 5 </modules>
例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合
1 <modules> 2 <module>../Hello</module> 3 <module>../HelloFriend</module> 4 <module>../MakeFriends</module> 5 </modules>
其中module的路径为相对路径。
其中module的路径为相对路径。
五、继承
继承为了消除重复,我们把很多相同的配置提取出来,例如:grouptId,version等
5.1、继承配置代码
1 <parent> 2 <groupId>me.gacl.maven</groupId> 3 <artifactId>ParentProject</artifactId> 4 <version>0.0.1-SNAPSHOT</version> 5 <relativePath>../ParentProject/pom.xml</relativePath> 6 </parent>
5.2、继承代码中定义属性
继承代码过程中,可以定义属性,例如:
1 <properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <junit.version>4.9</junit.version> 4 <maven.version>0.0.1-SNAPSHOT</maven.version> 5 </properties>
访问属性的方式为${junit.version},例如:
1 <dependency> 2 <groupId>junit</groupId> 3 <artifactId>junit</artifactId> 4 <version>${junit.version}</version> 5 <scope>test</scope> 6 </dependency>
5.3、父模块用dependencyManagement进行管理
1 <dependencyManagement> 2 <dependencies> 3 <dependency> 4 <groupId>junit</groupId> 5 <artifactId>junit</artifactId> 6 <version>${junit.version}</version> 7 <scope>test</scope> 8 </dependency> 9 <dependency> 10 <groupId>cn.itcast.maven</groupId> 11 <artifactId>HelloFriend</artifactId> 12 <version>${maven.version}</version> 13 <type>jar</type> 14 <scope>compile</scope> 15 </dependency> 16 </dependencies> 17 </dependencyManagement>
这样的好处是子模块可以有选择行的继承,而不需要全部继承。
六、聚合与继承的关系
聚合主要为了快速构建项目,继承主要为了消除重复