一、Maven 基本

1、自动化构建

​ 简单来说就是它可以自动的从建构过程的起点一直执行到终点:

image-20200814100951271

2、Maven 核心概念

  1. POM
  2. 约定的目录结构
  3. 坐标
  4. 依赖管理
  5. 仓库管理
  6. 生命周期
  7. 插件和目标
  8. 继承
  9. 聚合

3、安装使用

检查 JAVA_HOME 环境变量

image-20200814101632316

解压 Maven 的核心程序

​ 将 apache-maven-3.5.0-bin.zip 解压到一个非中文无空格的目录下。 例如:

1
D:\Server\apache-maven-3.5.0

配置环境变量

M2_HOME:D:\Server\ apache-maven-3.5.0(以自己安装路径的为准)

path:%M2_HOME%\bin 或 D:\Server\ apache-maven-3.5.0\bin

image-20200814102115989

image-20200814102232133

查看 Maven 版本信息验证安装是否正确

image-20200814102350685

配置本地仓库

  1. Maven 默认的本地仓库: ~.m2\repository 目录 。Tips: ~表示当前用户的家目录。
  2. Maven 的核心配置文件位置
1
解压目录\ D:\Server\ apache-maven-3.5.0\conf\settings.xml
  1. 设置方式
1
2
<localRepository>以及准备好的仓库位置</localRepository>
<localRepository>D:/RepMaven</localRepository>

image-20200814103208846

  1. 配置镜像源
1
2
3
4
5
6
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

image-20200814103321838

  1. 配置使用的 JDK 版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<profile>
<id>jdk-1.8</id>

<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>

image-20200814103501320

二、Maven 结构

image-20200814102727162

  • main: 目录用于存放主程序
  • test: 目录用于存放测试的程序
  • java: 目录用于存放源码的文件。
  • resources: 目录用于存放配置文件和资源文件

1、Maven 约定的目录结构 (cmd 中使用)

注意:运行 Maven 命令时一定要进入 pom.xml 文件所在的目录!

指令描述
mvn compile编译源代码
mvn test-compile编译测试代码
mvn test运行应用程序中的单元测试
mvn clean清除目标目录中的生成结果
mvn site生成项目相关信息的网站
mvn package依据项目生成 jar 文件
mvn install在本地 Repository 中安装 jar
mvn idea:idea生成 idea 项目
mvn archetype:create创建 Maven 项目
mvn eclipse:eclipse生成 eclipse 项目
mvn source:jar单独打包源码

补充:

指令描述
mvn clean package
mvn clean compile清理编译
mvn clean test

三、POM

Project Object Model:项目对象模型。 将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。
Maven 工程的核心配置。 可以说学习 Maven 就是学习 pom.xml 文件中的配置。

四、坐标

1、Maven 的坐标

<groupId>com.oy.maven</groupId>

<artifactId>Hello</artifactId>

<version>0.0.1-SNAPSHOT</version>

  • groupId:公司或组织的域名倒序+当前项目名称
  • artifactId: 当前项目的模块名称
  • version:当前模块的版本

2、通过坐标到仓库中查找 jar 包

  1. 将 gav 三个向量连起来
1
com.oy.maven+Hello+0.0.1-SNAPSHOT
  1. 以连起来的字符串作为目录结构到仓库中查找
1
com/oy/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar

注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。 安装的命令是: mvn install

五、依赖管理

1、基本概念

当 A jar 包需要用到 B jar 包中的类时,我们就说 A 对 B 有依赖。例如: commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar。通过第二个 Maven 工程我们已经看到, 当前工程会到本地仓库中根据坐标查找它所依赖的 jar 包。配置的基本形式是使用 dependency 标签指定目标 jar 包的坐标。 例如:

1
2
3
4
5
6
7
8
9
10
<dependencies>
<dependency>
<!—坐标 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<!-- 依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>

2、接依赖和间接依赖

如果 A 依赖 B, B 依赖 C, 那么 A→B 和 B→C 都是直接依赖,而 A→C 是间接依赖。

3、依赖的范围

① compile

  1. main 目录下的 Java 代码可以访问这个范围的依赖

  2. test 目录下的 Java 代码可以访问这个范围的依赖

  3. 部署到 Tomcat 服务器上运行时放在 WEB-INF 的 lib 目录下

​ 例如: 对 Hello 的依赖。主程序、测试程序和服务器运行时都需要用到。

② test

  1. main 目录下的 Java 代码不能访问这个范围的依赖
  2. test 目录下的 Java 代码可以访问这个范围的依赖
  3. ]部署到 Tomcat 服务器上运行时不会放在 WEB-INF 的 lib 目录下

​ 例如:对 junit 的依赖。仅仅是测试程序部分需要。

③ provided

  1. main 目录下的 Java 代码可以访问这个范围的依赖

  2. test 目录下的 Java 代码可以访问这个范围的依赖

  3. 部署到 Tomcat 服务器上运行时不会放在 WEB-INF 的 lib 目录下

    例如: servlet-api 在服务器上运行时, Servlet 容器会提供相关 API,所以部署的时候不需要。

4、依赖的传递性

image-20200814111132056

5、依赖的原则: 解决 jar 包冲突

① 路径最短者优先

image-20200814111224221

② 路径相同时先声明者优先

image-20200814111255314

​ 这里“声明”的先后顺序指的是 dependency 标签配置的先后顺序。

6、依赖的排除

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Survey160225_4_Environment</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 依赖排除 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

7、统一管理目标 jar 包的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
....
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

六、生命周期

1、Maven 的生命周期

Maven 有三套相互独立的生命周期, 分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

再次强调一下它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

2、clean 生命周期

Clean 生命周期一共包含了三个阶段:

  1. pre-clean 执行一些需要在 clean 之前完成的工作
  2. clean 移除所有上一次构建生成的文件
  3. post-clean 执行一些需要在 clean 之后立刻完成的工作

3、Site 生命周期

  1. pre-site 执行一些需要在生成站点文档之前完成的工作
  2. site 生成项目的站点文档
  3. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  4. site-deploy 将生成的站点文档部署到特定的服务器上
  5. 这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大的功能, Manager 比较喜欢,文档及统计数据自动生成,很好看。

七、继承

​ 此时如果项目需要将各个模块的 junit 版本统一为 4.9, 那么到各个工程中手动修改无疑是非常不可取的。 使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。

1、创建父工程

​ 创建父工程和创建一般的 Java 工程操作一致,唯一需要注意的是: 打包方式处要设置为 pom

2、在子工程中引用父工程

.........从当前目录到父项目的 pom.xml 文件的相对路径

代码示例:

1
2
3
4
5
6
7
<parent>
<groupId>com.oy.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 指定从当前子工程的 pom.xml 文件出发,查找父工程的 pom.xml 的路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>

此时如果子工程的 groupId 和 version 如果和父工程重复则可以删除。

3、在父工程中管理依赖

将 Parent 项目中的 dependencies 标签,用 dependencyManagement 标签括起来

junitjunit4.9test

在子项目中重新指定需要的依赖,删除范围和版本号

junit

junit

八、聚合

​ 将多个工程拆分为模块后, 需要手动逐个安装到仓库后依赖才能够生效。 修改源码后也需要逐个手动进行 clean 操作。 而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。

1、配置聚合

​ 在总的聚合工程中使用 modules/module 标签组合, 指定模块工程的相对路径即可

1
2
3
4
5
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>