avatar


11.Maven

简介

Maven是专门用于管理和构建Java项目的工具,它的主要功能有:

  1. 提供了一套标准化的项目结构
  2. 提供了一套命令以完成项目构建
  3. 提供了一套依赖管理机制

官网:http://maven.apache.org

标准化的项目结构

每一个IDE,都有一个不同的项目结构,互相之间不通用,比如在Eclipse中创建的项目,无法在IDEA中使用。而Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样,通过Maven管理的项目在所有的IDE通用。

如图是Maven构建的项目结构:

标准化的项目结构

用于项目构建的命令

通常一个项目的构建需要经过:

  1. 编译
  2. 测试
  3. 打包
  4. 发布

而Maven提供了一套命令,以更方便的,完成项目构建。

(具体命令,我们会在下文讨论。)

依赖管理机制

在上一章,我们引入了各种的包,当时,我们的步骤有:

  1. 下载JAR包
  2. 复制JAR包到项目
  3. 将JAR包加入"工作环境",Add a Library

当JAR包多的时候,会非常麻烦。

通过Maven,我们可以使用坐标来管理各种依赖。
如下,就是一个坐标

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>

解释一下:

  • groupId:所隶属组织名称
  • artifactId:项目名称
  • version:版本号

仓库

那么,Maven是在哪里找到的JAR包,并导入到项目的呢?
在仓库中找到的。

Maven中的仓库有:

  1. 本地仓库:自己计算机上的一个目录
  2. 中央仓库:由Maven团队维护的全球唯一的仓库
    地址:https://repo1.maven.org/maven2/

当我们引入一个JAR包后,首先会查看本地仓库有没有,如果本地仓库没有的话,会从中央仓库下载到本地仓库,再引入项目中。再次引入该JAR包的时候,则直接从本地仓库引入。

还有一个仓库,被称为远程仓库,是各个公司内部搭建的仓库,在有了远程仓库后,上述的顺序为:本地仓库、远程仓库、中央仓库。

但是,我们通过仓库去找包并不方便,所以也推荐这个地址:https://mvnrepository.com

工具准备

安装

解压

Maven是一款"绿色版"软件,直接解压即可。
建议解压缩到没有中文、特殊字符的路径下。

解压缩后目录结构如下:
目录结构

解释一下:

  • bin:存放的是可执行命令。
    例如:mvn
  • conf:存放Maven的配置文件。
    例如:其中的settings.xml
  • lib:存放Maven依赖的JAR包。

Windows

对于Windows,我们需要配置系统的环境变量,在Path中新增mvn所在的目录。
mvn

然后通过命令mvn -version,查看是否已经配置成功,示例代码:

1
mvn -version

运行结果:

1
2
3
4
5
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: C:\APP\maven\apache-maven-3.8.5
Java version: 1.8.0_333, vendor: Oracle Corporation, runtime: C:\APP\Java\jre1.8.0_333
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

macOS

对于macOS:我们可以解压在/usr/local/目录下。
然后执行open -e ~/.bash_profile,打开~/.bash_profile,新增如下内容:

1
2
export M3_HOME=/usr/local/maven/apache-maven-3.8.5
export PATH=$PATH:$M3_HOME/bin

执行source ~/.bash_profile,刷新~/.bash_profile,再通过mvn -version试一试。

如果报错command not found: mvn的话,除了路径配置不对,还可能是没有配置JDK,在~/.bash_profile,添加如下内容:

1
2
3
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

如果重启Terminal后,又报错command not found: mvn,可以参考如下的方法解决:

  1. 查看文件内容:cat ~/.zshrc
  2. 如果文件不存在,或者存在直接进入编辑状态:vim ~/.zshrc
  3. 讲上述内容,在~/.zshrc再配置一遍。

配置

本地仓库

Maven中,默认本地仓库的地址是${user.home}/.m2/repository,我们可以在conf/settings.xml修改这个地址。

默认本地仓库

中央仓库

Maven官方的中央仓库在国外,所以下载JAR包速度可能比较慢,可以采用阿里巴巴提供的一个远程仓库,我们可以在conf/settings.xml中的<mirrors>标签下,添加子标签<mirror>,内容如下:

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的常用命令有:

  1. compile:编译
  2. test:测试
  3. package:打包
  4. install:安装
  5. clean:清理

compile:编译

我们在某个maven项目的pom文件的同级目录,执行mvn compile,示例代码:

1
mvn compile

运行结果:

1
2
3
4
5
6
7
8
9
10

【部分运行结果略】

[INFO] Compiling 1 source file to /Users/kaka/Documents/maven-project/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.637 s
[INFO] Finished at: 2022-06-11T15:46:38+08:00
[INFO] ------------------------------------------------------------------------

观察日志

1
Compiling 1 source file to /Users/kaka/Documents/maven-project/target/classes

即,编译得到的字节码文件会在target/classes目录下。

test:测试

执行mvn test,会自动执行,maven项目中test下的相关测试代码,即

测试代码

示例代码:

1
mvn test

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

【部分运行结果略】

[INFO] Compiling 1 source file to /Users/kaka/Documents/maven-project/target/classes

【部分运行结果略】

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.kakawanyifan.TestMaven
maven test ====>
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.059 s
[INFO] Finished at: 2022-06-11T15:48:54+08:00
[INFO] ------------------------------------------------------------------------

package:打包

执行mvn package,会将maven项目打成一个JAR包或者WAR包,示例代码:

1
mvn package

运行结果:

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

【部分运行结果略】

[INFO] Compiling 1 source file to /Users/kaka/Documents/maven-project/target/classes

【部分运行结果略】

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.kakawanyifan.TestMaven
maven test ====>
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-project ---
[INFO] Building jar: /Users/kaka/Documents/maven-project/target/maven-project-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.364 s
[INFO] Finished at: 2022-06-11T15:49:55+08:00
[INFO] ------------------------------------------------------------------------

观察日志:

1
Building jar: /Users/kaka/Documents/maven-project/target/maven-project-1.0-SNAPSHOT.jar

即,所打的包会在target目录下。

install:安装

执行mvn install,会将打的包,复制到Maven的本地仓库。

示例代码:

1
mvn install

运行结果:

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

【部分运行结果略】

[INFO] Compiling 1 source file to /Users/kaka/Documents/maven-project/target/classes

【部分运行结果略】

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.kakawanyifan.TestMaven
maven test ====>
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.043 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-project ---
[INFO] Building jar: /Users/kaka/Documents/maven-project/target/maven-project-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ maven-project ---
[INFO] Installing /Users/kaka/Documents/maven-project/target/maven-project-1.0-SNAPSHOT.jar to /Users/kaka/.m2/repository/com/itheima/maven-project/1.0-SNAPSHOT/maven-project-1.0-SNAPSHOT.jar
[INFO] Installing /Users/kaka/Documents/maven-project/pom.xml to /Users/kaka/.m2/repository/com/itheima/maven-project/1.0-SNAPSHOT/maven-project-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.220 s
[INFO] Finished at: 2022-06-11T15:51:23+08:00
[INFO] ------------------------------------------------------------------------

观察日志:

1
2
[INFO] Installing /Users/kaka/Documents/maven-project/target/maven-project-1.0-SNAPSHOT.jar to /Users/kaka/.m2/repository/com/itheima/maven-project/1.0-SNAPSHOT/maven-project-1.0-SNAPSHOT.jar
[INFO] Installing /Users/kaka/Documents/maven-project/pom.xml to /Users/kaka/.m2/repository/com/itheima/maven-project/1.0-SNAPSHOT/maven-project-1.0-SNAPSHOT.pom

target目录下的maven-project-1.0-SNAPSHOT.jar复制到了maven仓库的maven-project-1.0-SNAPSHOT.jar

clean:清理

执行mvn clean后,会删除target目录中的内容。

生命周期

通过上文的运行结果,我们还发现,在执行install的时候,也会依次执行:compiletest package
即,四个命令依次执行,执行后面的命令的时候,会先执行前面的命令。
这就是maven的"核心工作"的生命周期,当然,"核心工作"的命令并不是只有这些,这些只是我们主要需要关注的。

在maven中,一共有三套生命周期:

  1. 清理工作
  2. 核心工作
  3. 产生报告,发布站点

在IDEA使用

配置Maven环境

打开IDEA的配置。

  • 对于Windows,依次点击FileSettings
  • 对于macOS,点击Preferences

修改图中红框所标之处。

修改maven

创建Maven项目

创建模块,选择Maven

创建模块,选择Maven

填写模块名称,坐标信息

填写模块名称,坐标信息

导入Maven项目

选择右侧Maven面板,点击+号,选择对应的pom文件

Maven+

如果没有Maven面板,可以通过如下的方式打开。

Maven面板

依赖管理

在项目的pom.xml中编写<dependencies>,在<dependencies>中添加子标签<dependency>,并点击刷新按钮,使其生效。
具体坐标可以通过如下网站搜素

https://mvnrepository.com/

如图,是我们引入的包:
使用坐标引入包

有一个标签scope,依赖范围,可以设置对应JAR包的作用范围,默认是compile

常见的有四种:

依赖范围 编译环境 测试环境 运行环境
compile
test
provided
runtime

关于Maven的内容其实还有很多,包括 项目模块化 ,我们会在后续会用到的时候再讨论。

文章作者: Kaka Wan Yifan
文章链接: https://kakawanyifan.com/10811
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kaka Wan Yifan

留言板