0%

项目管理工具Maven的使用

项目管理工具Maven的使用

1 简介

1.1 概述

  • Maven是一款项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)

1.2 功能

  • 项目构建:提供标准的、跨平台的自动化项目构建方式
  • 依赖管理:方便快捷地管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准、统一的项目结构

2 安装配置

2.1 下载Maven

  • 下载地址,

https://maven.apache.org/download.cgi

img

如果是Windows平台,选择zip安装包下载

2.2 解压、移动文件

  • 解压zip文件,

img

将maven根目录移动到一个固定的目录下,

img

2.3 配置环境变量

2.3.1 MAVEN_HOME

  • 新建一个系统环境变量,命名为MAVEN_HOME,值为maven根目录的路径

img

2.3.2 Path

  • 编辑环境变量Path,在末尾添加maven bin目录的路径,

img

2.4 测试

  • 重新打开一个cmd窗口,执行命令mvn,

img

如果出现上图中的提示信息,说明安装成功

3 基本概念

3.1 仓库

  • 仓库用于存储资源,包含各种jar包

img

3.1.1 分类

  • 本地仓库:自己电脑上存储资源的仓库,必要时从远程仓库获取资源
  • 远程仓库:

(1)中央仓库:Maven团队维护,存储绝大多数资源

(2)私服:部门/公司范围内存储资源的仓库,必要时从中央仓库获取资源

3.1.2 私服的作用

  • 保存具有版权的资源,包含购买或自主研发的jar包
  • 一定范围内共享资源,仅对内部开发,不对外共享

3.2 坐标

3.2.1 作用

  • Maven中的坐标用于描述仓库中资源的位置
  • 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

3.2.1 组成

  • groupId:当前Maven项目隶属的组织名称(通常是域名反写,例如:org.mybatis)
  • artifactId:当前Maven项目名称(通常是模块名称,例如CMS、SMS)
  • version:当前版本号

3.3 仓库配置

3.3.1 本地仓库路径

  • 打开%MAVEN_HOME%\conf目录下的settings.xml配置文件,定位到localRepository标签,

img

添加一个localRepository标签,内部填上本地仓库的路径(默认为:${user.home}/.m2/repository)

3.3.2 镜像仓库地址

  • 定位到mirros标签,在内部添加如下一段配置,
1
2
3
4
5
6
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Public Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

将Aliyun Maven仓库设置为中央仓库的镜像

4 实践

4.1 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ tree maven_demo/
maven_demo/
├── pom.xml # POM配置文件
├── src # 存放项目源代码文件
│ ├── main # 存放项目的主要代码
│ │ ├── java # 存放java源代码文件
│ │ │ └── Demo.java
│ │ └── resources # 存放项目配置文件(比如Spring的xml配置文件)
│ └── test
│ ├── java # 存放测试所用的java源代码
│ │ └── DemoTest.java
│ └── resources # 存放测试所用的配置文件
└── target # 项目编译后产生的一个目录,主要存放的是编译后的.class文件
├── classes
│ └── Demo.class
├── generated-sources
│ └── annotations
├── generated-test-sources
│ └── test-annotations
├── maven-status
│ └── maven-compiler-plugin
│ └── compile
│ └── default-compile
│ ├── createdFiles.lst
│ └── inputFiles.lst
└── test-classes
└── DemoTest.class

4.2 pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<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">
<!-- POM模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或组织的唯一标识 -->
<groupId>com.company</groupId>
<!-- 项目的唯一标识 -->
<artifactId>maven-demo</artifactId>
<!-- 项目版本号 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 打包方式 -->
<packaging>jar</packaging>

<!-- 定义项目依赖-->
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<!-- 公司或组织的唯一标识 -->
<groupId>junit</groupId>
<!-- 项目的唯一标识 -->
<artifactId>junit</artifactId>
<!-- 项目版本号 -->
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

4.3 常用命令

4.3.1 项目构建:mvn compile

  • 在maven项目根目录下执行mvn compile命令,

img

maven将自动下载项目所需依赖和maven插件,然后进行构建

4.3.2 项目测试:mvn test

img

img

  • 除了在控制台展示测试结果,还在target\surefire-reports目录下生成测试数据文件

4.3.3 清理编译产物:mvn clean

img

  • mvn clean命令将整个target目录删除

4.3.4 打包:mvn package

img

img

  • 打包的过程需要经历:主程序编译、测试程序编译、执行测试程序、最终打包,然后jar(war)包会被存放在target目录下,其中只包含主程序,不包含测试程序

4.3.5 安装本地仓库:mvn install

  • mvn install命令依然会经过:主程序编译、测试程序编译、执行测试程序、打包等步骤

4.4 依赖管理

  • 依赖指当前项目运行所需的jar包,一个项目可以设置多个依赖

4.4.1 配置格式

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 定义项目依赖-->
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<!-- 项目所属公司或组织的唯一标识-->
<groupId>junit</groupId>
<!-- 项目的唯一标识-->
<artifactId>junit</artifactId>
<!-- 项目版本号-->
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>

4.4.2 依赖传递

4.4.2.1 依赖的传递性

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他的资源,当前项目间接依赖其他资源

4.4.2.2 依赖传递冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低;层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的

4.4.3 可选依赖(不透明)

  • 可选依赖指对外隐藏当前所依赖的资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 定义项目依赖-->
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<!-- 目所属公司或组织的唯一标识 -->
<groupId>junit</groupId>
<!-- 项目的唯一标识 -->
<artifactId>junit</artifactId>
<!-- 项目版本号 -->
<version>4.13.2</version>
<!-- 配置可选依赖 -->
<optional>true</optional>
</dependency>
</dependencies>

4.4.4 排除依赖(不需要)

  • 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- 定义项目依赖-->
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<!-- 项目所属公司或组织的唯一标识-->
<groupId>junit</groupId>
<!-- 项目的唯一标识-->
<artifactId>junit</artifactId>
<!-- 项目版本号-->
<version>4.13.2</version>
<!-- 配置可选依赖-->
<optional>true</optional>
<!-- 排除依赖-->
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

4.4.5 依赖范围

  • 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其依赖范围

4.4.5.1 依赖作用范围

  • 主程序范围有效(main文件夹范围内)
  • 测试程序范围有效(test文件夹范围内)
  • 是否参与打包(package指令范围内)
scope 主代码 测试代码 打包 范例
compile(默认) Y Y Y log4j
test Y junit
provided Y Y servlet-api
runtime Y jdbc

4.5 生命周期

4.5.1 什么是Maven构建生命周期

  • Maven构建生命周期描述的是一次构建过程经历的事件

4.5.2 阶段

  • clean:清理工作
  • default:核心工作,例如编译、测试、打包、部署等
  • site:产生报告,发布站点等

4.5.3 clean生命周期

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

4.5.4 default生命周期

生命周期阶段 描述
validate 验证项目是否正确,并且所有必要的信息可用于完成构建过程
initialize 建立初始化状态,例如设置属性
generate-sources 产生任何的源代码包含在编译阶段
process-resources 复制和处理资源到目标目录,准备打包阶段
compile 编译该项目的源代码
process-classes 从编译生成的文件提交处理,例如:Java类的字节码增强/优化
generate-test-sources 生成任何测试的源代码包含在编译阶段
process-test-sources 处理测试源代码,例如:过滤器任何值
test-compile 编译测试源代码到测试目标目录
process-test-classes 处理测试代码文件编译生成的文件
test 运行测试使用合适的单元测试框架(JUnit)
prepare-package 执行必要的任何操作的实际打包之前准备一个包
package 提取编译后的代码,并在其分发格式打包,如JAR、WAR或EAR文件
pre-integration-test 完成执行集成测试之前所需操作。例如,设置所需的环境
integration-test 处理并在必要时部署软件包到集成测试可以运行的环境
post-integration-test 完成集成测试已全部执行后所需操作。例如:清理环境
verify 运行任何检查,验证包是有效的,符合质量审核规定
install 将包安装到本地存储库,它可以用作当地其他项目的依赖
deploy 复制最终的包到远程仓库与其他开发者和项目共享

4.5.6 site生命周期

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到服务器上

4.6 插件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认Maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>