一、概念
Maven 是一个项目管理和整合工具。通过对 目录结构和构建生命周期 的标准化, 使开发团队用极少的时间就能够自动完成工程的基础构建配置。
Maven 简化了工程的构建过程,并对其标准化,提高了重用性。
- Maven 本地仓库 (Local Repository):
- 每个开发者的计算机上都有一个本地仓库,用于存储下载的依赖库。
- 本地仓库通常位于用户的 ~/.m2/repository 目录下(在 Windows 上通常是 C:\Users<username>.m2\repository)。
- Nexus 私服 (Private Repository):
- Nexus 是一个流行的仓库管理工具,用于托管私有仓库。
- 私有仓库可以存储企业内部的库,也可以作为中央仓库的缓存,提高下载速度。
- 开发者通过 HTTP 访问 Nexus 私服,下载所需的依赖库。
- Maven 中央仓库 (Central Repository):
- Maven 中央仓库是公共的、开源的库仓库,包含了大量开源项目的库。
- 开发者可以通过 HTTP 访问 Maven 中央仓库,下载开源库。
工作流程:
- 开发者的 Maven 项目:
- 开发者在本地计算机上使用 Maven 管理项目。
- Maven 项目通过 pom.xml 文件定义依赖关系。
- 依赖查找:
- 当 Maven 需要下载一个依赖库时,它首先检查本地仓库。
- 如果本地仓库中没有该库,则 Maven 会尝试从 Nexus 私服下载。
- 如果 Nexus 私服中也没有该库,则 Maven 会从 Maven 中央仓库下载,并将该库缓存到本地仓库和 Nexus 私服中。
- 配置文件:
- settings.xml 文件用于配置 Maven 的全局设置,包括镜像、服务器认证信息等。
- pom.xml 文件用于定义项目的构建配置和依赖关系。
具体步骤:
- 本地仓库检查:
- Maven 首先检查本地仓库是否有所需的依赖库。
- Nexus 私服检查:
- 如果本地仓库中没有,Maven 会尝试从 Nexus 私服下载。
- Maven 中央仓库检查:
- 如果 Nexus 私服中也没有,Maven 会从 Maven 中央仓库下载,并将该库缓存到本地仓库和 Nexus 私服中。
二、Maven目录结构
根目录:工程名
|---src://源码
|---|---main: //存放主程序
|---|---|---java: //源码文件
|---|---|---resources: //存放框架的资源文件
|---|---test://存放测试程序
|---|---|---java: //java测试文件
|---|---|---resources: //java测试的资源文件
|---pom.xml://maven的核心配置文件
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
</dependencies>
</project>
三、仓库
Maven 仓库有两种类型:
- 本地仓库(local):自己电脑上存储资源的仓库,通过连接远程仓库获取资源
- 远程仓库(remote):非自己电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:公司范围内存储资源的仓库,从中央仓库获取资源或自己的资源,仅对内部开放,不对外共享
本地仓库:
- 本地仓库说明:
Maven 本地仓库是机器上的一个文件夹,它在你第一次运行任何 maven 命令的时候创建。
Maven 本地仓库保存你的工程的所有依赖。当你运行一次 Maven 构建命令,Maven 会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用存放在远程机器上的依赖文件。
- 本地仓库存放位置
本地仓库默认被创建在 C:\Users\用户名.m2\ 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 settings.xml 文件中定义另一个路径。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>${user.home}/.m2/repository</localRepository>
</settings>
中央仓库:
Maven 中央仓库是由 Maven 社区提供的仓库。
//设置成功后,会从阿里的镜像库中获取依赖,不会从 Maven 中央仓库中获取依赖了。
<!--添加如下配置:设置阿里镜像库-->
<mirror>
<id>ali</id>
<name>ali Maven</name>
<mirrorOf>*</mirrorOf>
<url>https://maven.aliyun.com/repository/public/</url>
</mirror>
私服:
私服是一种在公司内部或局域网中使用的远程仓库。它通常由公司自己搭建,用于存储公司内部开发的库和插件,也可以从中央仓库或其他远程仓库获取依赖。私服可以加快公司内部项目的构建速度,同时也可以避免外部网络不稳定对项目构建的影响。
四、坐标和依赖
<dependency>
<!--工程组的标识,它在一个组织或者项目中通常是唯一的,公司或域名倒序+项目名-->
<groupId>mysql</groupId>
<!--工程的名称,模块名-->
<artifactId>mysql-connector-java</artifactId>
<!--工程的版本号-->
<version>8.0.31</version>
</dependency>
groupId:
这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.company.bank 拥有所有的和银行相关的项目。
artifactId:
这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。
version:
这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
<!--scope标签代表指定依赖范围-->
<scope>runtime</scope>
</dependency>
</dependencies>
compile:
默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段;
runtime:
只在运行时使用,如JDBC驱动,适用运行和测试阶段;
test:
只在测试时使用,用于编译和运行测试代码,不会随项目发布;
provided:
只在开发、测试阶段使用。
五、Maven生命周期命令
命令 | 作用 |
---|---|
mvn compile | 编译主程序 src/main ,生成target目录,存放编译主程序生成的字节码文件,输出到 target/classes |
mvn test-compile | 编译测试程序 src/main ,生成target目录,存放编译主程序生成的字节码文件,输出到 target/classes |
mvn test | 编写的测试代码并生成测试报告(目前对于后端开发没有太大作用) |
mvn package | 将项目打成jar包 |
mvn clean | 清空项目本地编译目录 |
mvn install | 将项目 安装到本地仓库(多个项目相互依赖 相互使用时.) |
这是最常用的生命周期,用于编译、测试、打包和部署项目。它的典型阶段包括:
- validate:验证项目的正确性以及所有必要的信息是否可用。
- compile:编译项目的源代码。
- test:使用合适的单元测试框架(如 JUnit)运行测试,但不包含生成的测试代码。
- package:将编译后的代码打包成可分发格式,如 JAR 或 WAR 文件。
- verify:对集成测试的结果进行检查,确保质量标准得到满足。
- install:将包安装到本地仓库,以便其他本地项目可以依赖它。
- deploy:在集成或发布环境中完成,将最终的包复制到远程仓库中。