一、Maven坐标
1. 主要组成
- groupId:组织标志(包名)
- artifactId:项目名称
- version:项目的当前版本
- packaging:项目的打包方式,主要是jar和war两种
2. maven为什么要使用坐标
- Maven世界拥有大量构建,我们需要
通过唯一的标识来构建一个统一规范 - 拥有了统一规范就可以把查找的工作交给软件自己去查找执行
二、依赖管理
2.1 依赖配置
依赖配置的格式如下:
<!--添加依赖配置-->
<dependencies>
<!--项目要使用到junit的jar包,所以在这里添加junit的jar包的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<!--项目要使用到Hello的jar包,所以在这里添加Hello的jar包的依赖-->
<dependency>
<groupId>me.gacl.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
2.2 依赖范围
依赖范围scope
用来控制依赖和编译,测试,运行的classpath
的关系。主要的是三种依赖关系:
* compile: 默认编译依赖范围。对于编译、测试、运行三种classpath都有效
* test: 测试依赖范围。只对于测试的classpath有效
* provided: 已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为容器已经提供,例如servlet-api
* runtime: 运行时提供。例如:jdbc驱动
三、 仓库管理
3.1 Maven
仓库
用来统一存储所有Maven
共享构建的位置就是仓库
3.2 Maven
仓库布局
根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging
3.3 仓库的分类
3.3.1 本地仓库
每个用户都拥有本地仓库,默认是在~/.m2/repository/,~代表的是用户目录
3.3.2 远程仓库
- 中央仓库:
Maven
默认的远程仓库,地址 http://search.maven.org/ - 私服: 是一种特殊的远程仓库,它是架设在局域网内的仓库。
四、 生命周期
4.1 什么是maven的生命周期?
maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有的构建步骤
4.2 Maven三大生命周期
Maven 有三套相互独立的生命周期,分别是:
1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
3. Site Lifecycle 生成项目报告,站点,发布站点。
在是使用 mvn clean install site
运行所有这三套生命周期。
Clean生命周期包括三个阶段:
1. pre-clean 执行一些需要在clean之前完成的工作
2. clean 移除所有上一次构建生成的文件。
3. post-clean 执行一些需要在clean之后完成的工作
Site 生命周期pre-site执行一些需要在生成站点文档之前完成的工作
- site生成项目的站点文档
- post-site 执行一些需要在站点文档生成之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上。
这里经常用到的site阶段和site-deploy阶段,用以生成和发布maven站点,这个maven功能相当强大。Manager能生成比较好看的文档以及统计数据。
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大多数工作都发生在这个生命周期中。
解释一些比较重要和常用的阶段。
- process-resources 复制并处理资源文件至目标目录,准备打包。
- compile 编译项目的源代码
- process-test-resources 复制并处理资源文件,至目标测试目录
- test-compile 编译测试源代码
- test 使用合适的单元测试框架进行测试,这些测试代码不会被打包或部署。
- package 接受编译好的代码,打包成可发布的格式,如jar
- install 将包安装至本地仓库,以让其他项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其他开发人员与项目共享。
五、Maven 插件
- Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
- 每个插件都能实现多个功能,每个功能就是一个插件的目标。
- Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件 maven-compiler-plugin的一个插件目标
六、 聚合和集成
聚合
maven允许我们一次构建多个项目模块,那我们就需要对多个项目模块进行聚合
1. 聚合代码配置
<modules>
<module>模块一</module>
<module>模块二</module>
<module>模块三</module>
</modules>
例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
继承
继承为了消除重复,我们把很多相同的配置提取出来,例如:groupId、version等
- 继承代码配置
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../ParentProject/pom.xml</relativePath>
</parent>
- 继承代码过程中,可以定义属性,例如:
<propertied>
<project.build.sourceEncoding>UTF—8</project.build.sourceEncoding>
<junit.version>4.9</junit.version>
<maven.version>0.0.1-SNAPSHOT</maver.version>
<propertied>
访问属性的方式为 ${junit.version},例如:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
- 父模块用dependencyManagement进行管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>${maven.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
这样的好处是子模块可以有选择性的进行继承,而不是要全部继承。
- 聚合和继承的作用
聚合主要是为了快速构建项目,继承主要为了消除重复
聚合与继承实战演练
创建四个Maven项目
这四个项目放在同一个目录下,方便聚合和继续
Parent项目是其它三个项目的父项目,主要是用来配置一些公共的配置,其它三个项目再通过继承的方式拥有Parent项目中的配置,首先配置Parent项目的pom.xml,添加对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合以及jar包依赖,pom.xml的配置信息如下:
Parent项目的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.gacl.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Parent</name>
<url>http://maven.apache.org</url>
<!-- 对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合 -->
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
<!-- 定义属性 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.9</junit.version>
<maven.version>0.0.1-SNAPSHOT</maven.version>
</properties>
<!-- 用dependencyManagement进行jar包依赖管理 -->
<dependencyManagement>
<!-- 配置jar包依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- 访问junit.version属性 -->
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>me.gacl.maven</groupId>
<artifactId>Hello</artifactId>
<!-- 访问maven.version属性 -->
<version>${maven.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.gacl.maven</groupId>
<artifactId>HelloFriend</artifactId>
<!-- 访问maven.version属性 -->
<version>${maven.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在Hello项目的pom.xml中继承Parent项目的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>Hello</artifactId>
<!-- 继承Parent项目中的pom.xml配置 -->
<parent>
<groupId>me.gacl.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 使用相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
在HelloFriend项目的pom.xml中继承Parent项目的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>HelloFriend</artifactId>
<name>HelloFriend</name>
<!-- 继承Parent项目中的pom.xml配置 -->
<parent>
<groupId>me.gacl.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,
可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- HelloFriend项目中使用到了Hello项目中的类,因此需要添加对Hello.jar的依赖
Hello.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了
因此这里也可以省略不写了
-->
<dependency>
<groupId>me.gacl.maven</groupId>
<artifactId>Hello</artifactId>
</dependency>
</dependencies>
</project>
在MakeFriends项目的pom.xml中继承Parent项目的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>MakeFriends</artifactId>
<!-- 继承Parent项目中的pom.xml配置 -->
<parent>
<groupId>me.gacl.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,
可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<!-- MakeFriends项目中使用到了HelloFriend项目中的类,因此需要添加对HelloFriend.jar的依赖
HelloFriend.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了
因此这里也可以省略不写了
-->
<groupId>me.gacl.maven</groupId>
<artifactId>HelloFriend</artifactId>
</dependency>
</dependencies>
</project>
以上的四个项目的pom.xml经过这样的配置之后,就完成了在Parent项目中聚合Hello、HelloFriend、MakeFriends这三个子项目(子模块),而Hello、HelloFriend、MakeFriends这三个子项目(子模块)也继承了Parent项目中的公共配置,这样就可以使用Maven一次性构建所有的项目了。