Maven入门

本文最后更新于:2021年8月31日 晚上

在实际开发中,我们会不可避免的使用各种各样的 Jar 包。为了避免每次都要手动复制 Jar 包的麻烦,Maven出现了。-d

Maven是一种项目管理工具,官方是这么定义的。简单来说呢 Maven 主要是为了在项目中实现自动导包的功能。当然实际上它不止可以做这些。

项目构建

在官方的定义中,maven 的项目构建分别是:清理、编译、打包、测试、报告、打包、安装、部署。这样理解会有一定抽象。

  1. 清理,就是清理先前的编译结果,为下一次编译做准备。
  2. 编译,主要是把java文件变成class文件,这个工作就和编译器干得差不多。
  3. 测试,对代码进行测试。
  4. 报告,显示测试结果。
  5. 打包,测试通过的项目工件封装成 jar 或者 war 包。
  6. 安装,将打好的包安装到本地仓库中。
  7. 部署,打好的包部署到服务器中。

简单来说 mavne 的核心功能还是管理 jar 包,自动测试,和发布(部署)项目

  • 约定大于配置

Maven安装与使用

安装Maven

  1. Apatch 官网下载最新的 Maven 工具。
  2. 解压 Maven 到某个文件夹
  3. 配置 Maven 环境变量
    1. MAVEN_HOME 环境变量,指向 Mavne 的安装目录
    2. M2_HOME 环境变量,指向 Maven 安装目录下的bin目录。
    3. path变量中添加指向 M2_HOME 变量。
  4. cmd中测试使用 mvn -version 命令测试是否安装成功。

配置Maven仓库

上面提到过 Maven 有一个中心仓库的概念,这个中心仓库,可以是远程,也可以是在本地,先配置一个本地仓库。我们把本地仓库放到 Maven 安装目录中。

  1. 在 Maven 安装目录下新建一个maven-re文件夹,这个文件夹作为我们的本地仓库
  2. 在 Maven 安装目录下的 conf 里有个settings.xml 文件,在里面加入
    1
    <localRepository>apache-maven-3.8.1\maven-re</localRepository>
    这样我们的本地仓库就算建好了。

远程仓库镜像

如果需要,还可以配置一个远程仓库镜像加快下载 Jar 包的速度
在上面的settigns.xml文件的标签中加入:

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

约定目录结构

Maven 中遵循约定大于配置的规定,所以我们的 Maven 项目都需要遵循这样一个目录结果:

1
2
3
4
5
6
7
8
9
//src
//main 放置主程序代码
//java 程序代码
//resource 资源文件

//test 放测试文件代码
//java 测试程序代码
//resource 测试资源文件
pom.xml Maven的核心配置文件

Maven 项目启动时会先读取 pom.xml 获取项目信息,然后允许 main 目录下的主程序。

Maven的使用

我们先通过命令行来使用Maven

  1. 先按照上面的目录结构建好一个 Maven 项目,并在 java 中随意编写一个 class,并编写一个 pom.xml 文件。
  2. 在项目根目录,也就是 src 同级的目录使用 cmd 命令 mvn compile 构建 maven 项目
  3. 构建结束后,项目根目录会生成一个名为 ‘target’ 的文件夹,它就是 maven 为我们编译好的结果。
  4. 在 target 的子目录 classes 中 执行 java 命令运行类以测试项目。

Idea 中 Maven 的使用

Idea中内置了Maven,不过我们前面都自己下好了一个,肯定是用我们自己的Maven。

我们需要在Idea->File->Settings->Build->BuildTools->Maven中,把Maven的home pathlocal repository改成我们刚刚配置的。

新建项目测试

Maven配置完成后,下一步开始新建项目测试,直接新建一个Maven项目,选择maven-archetype-webapp,然后注意选择Maven版本时选择我们刚刚配置好的Maven版本就行了。

添加 Maven 依赖

因为要用到servlet,所以我们还需要添加servlet的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

<!-- Jsp 依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>

配置完后,就能直接新建servlet啦。

Maven核心概念

Maven有一些核心名词,先了解一下:

  • pom : 项目对象模型,maven 把一个项目当成一个模型使用
  • 坐标:一个用来表示项目资源位置的字符串
  • 依赖管理:就是管理各种 jar 包之间的依赖关系
  • 仓库管理:管理远程仓库或者本地仓库,仓库用来放各种 jar 包
  • 生命周期:整个项目构建的流程就是一个生命周期
  • 插件和目标:maven 中使用插件(就是jar)来实现某个功能,一个单独的生命周期过程就是一个目标
  • 继承:maven 父子项目
  • 聚合:合并多个小项目

仓库

Maven 通过仓库来进行依赖管理,依赖管理是指管理各种 jar 包,这其中有 Maven 用来构建项目的 jar,也有我们项目自己依赖的 jar。

仓库分为远程仓库和本地仓库,构建项目需要 jar 包时,先在本地仓库找,找不到就去远程仓库找。

远程仓库其实还可以分为,中央仓库,中央仓库镜像,和本地的局域网仓库。

pom文件

在 Maven 中是把一个项目看成一个模型就行配置的,所以对项目的大部分操作都是体现在 pom 文件当中的。我们先来看一个简单的 pom 文件格式。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 用来表示 对象模型的版本,现在通常是4.0.0 -->
<modelVersion>4.0.0</modelVersion>

<groupId>org.lee.random</groupId>
<artifactId>ramdomId</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 定义依赖的作用范围 -->
<scope>compile</scope>

<!-- 指定 maven 项目的打包文件类型,默认是 jar,还可以是 war、rar、pom等-->
<packaging>jar</packaging>

<!-- 指定模型(项目)配置的属性 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<!-- 定义一个全局变量 -->
<aVersion>1.0.0</aVersion>
</properties>

<!-- 指定模型的构建属性,比如修改构建项目插件的一些属性 -->
<build>
</build>

<dependencies>
<dependence>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 使用properties中定义的全局变量 -->
<version>${aVersion}</version>
</dependence>
<dependence>...</dependence>
<dependence>...</dependence>
</dependencies>
</project>

坐标

任何一个 Maven 项目都必须要有它自己的坐标,坐标则用来标识项目,有点类似于数据库中的主键

Maven 项目的坐标由这三个标签组成

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 组 id 一般是公司域名倒写 -->
<groupId>org.lee.random</groupId>
<!-- 项目 id,也就是项目名 -->
<artifactId>ramdomId</artifactId>
<!-- 版本号,带 SNAPSHOT 表示是开发中版本 -->
<version>1.0-SNAPSHOT</version>
<!-- 依赖的作用范围,默认是compile
compile 代表整个生命周期这个依赖都存在
test 代表只在测试阶段存在
provided 代表只在编码阶段存在,打包以及之后都不需要这个依赖
-->
<scope>test</scope>

另外,坐标在仓库中的体现就是文件夹的目录结构。

依赖

当我们的项目需要使用别的 jar 包时,我们就直接的 pom 中写入依赖项,然后 maven 在构建项目时会自动帮我们去加载 jar 到我们的项目中。

1
2
3
4
5
6
<!-- 这个依赖的格式就和上面讲的 坐标 很像,所以说坐标用来定位一个资源 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>

生命周期、命令

前面所说的项目构建的几个步骤就是 Maven 项目的生命周期,其中的单独一个步骤,就是一个生命周期。

前面通过命令完成了项目的构建,当然还有更多的命令,这些命令都是通过插件完成的,也就是 jar 包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 清理项目,清理之前的编译结果 -->
mvn clean
<!-- 编译项目,会生成一个target文件夹作为编译结果 -->
mvn compile
<!-- 编译测试项目,编译main/java,会生成一个target文件夹作为编译结果 -->
mvn test-compile
<!-- 运行测试项目,编译test/java,会生成一个surefire文件夹,保存报告 -->
mvn test
<!-- 打包项目,按照pom文件给项目打包,打包好的文件输出到target文件夹中 -->
mvn package
<!-- 安装项目,打包本项目,按照坐标把本项目保存到本地仓库中,并使用坐标划分文件夹:groupId/artifactId/version/ *.jar -->
mvn install
<!-- 部署项目,除了保存到本地仓库外,还会上传到私有网络内的仓库中,并部署到web容器 -->
mvn deploy

<!-- 如果直接执行test命令,maven也会自动执行前面的 clean,compile,test-compile等。其它的命令也同理,会自动从头来一遍。 -->

测试项目

测试项目会测试类中的每一个方法,方法就是测试的最小单元,所有又叫单元测试。我们通过 junit.jar 插件来进行单元测试。

1
2
3
4
5
6
7
<!-- 加入这个依赖来实现单元测试的功能 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

推荐在测试类名和测试方法前都加上Test

测试方法也有定义规则,

  1. 方法是public
  2. 方法无返回值
  3. 方法加上注解@Test

Maven入门
https://travelerentity.github.io/2021/06/Maven入门/
作者
LinYun
发布于
2021年6月29日
许可协议