Maven(一)
首先我们要知道什么是Maven?他是干什么的?我相信大家对Maven并不陌生了,但大多数同学只是停留在要用而用的层面上,也就是大概知道他是干什么的,但真发生依赖冲突了那就无从下手了。Apache Maven 是一个 Java 项目构建和依赖管理工具,主要用于:自动化构建(编译、测试、打包、部署)。依赖管理(自动下载和管理第三方库)。标准化项目结构(约定优于配置)。
核心特点
- 基于 POM(Project Object Model):通过
pom.xml
文件定义项目配置。 - 依赖传递性:自动解析并下载依赖的依赖(如
A
依赖B
,B
依赖C
,Maven 会自动引入C
)。 - 构建生命周期:提供标准化的构建阶段(如
clean
、compile
、package
)。 - 插件体系:通过插件扩展功能(如
maven-compiler-plugin
用于编译)。
这边就不介绍Maven的安装与配置了,需要的小伙伴自己去查吧。Maven安装与配置(详细步骤)_maven安装及配置教程-CSDN博客
GAV坐标
<groupId>com.example</groupId>//公司ID
<artifactId>my-project</artifactId>//项目名
<version>1.0.0</version>//版本
为什么叫坐标呢?其实就是为了找到唯一的一个jar包,因为我们的很多组件很多依赖都是在Maven中心库的,重复名称的jar当然也是非常多的,那么为了能够找到唯一的一个jar包就需要三级标签,第一确定是什么公司,第二确定是公司里的什么项目,第三再确定版本号,而对于的jar包下载到本地仓库后到路径也是如下:
本地仓库目录/com/example/my-project/1.0.0/my-project-1.0.0.jar
Maven项目和Maven工程的区别
这两个术语经常被混用,但根据官方文档和实际使用习惯,它们存在一些细微差别。
概念 | Maven 项目 (Maven Project) | Maven 工程 (Maven Module/Engineering) |
---|---|---|
范围 | 单个独立项目 | 多模块组成的复杂工程体系 |
POM 文件 | 单个 pom.xml | 一个父 POM + 多个子模块 POM |
典型场景 | 小型应用、工具库 | 企业级系统、微服务套件 |
构建方式 | mvn package | mvn install (需先构建依赖模块) |
Maven项目的目录结构
my-project/
├── src/
│ ├── main/
│ └── test/
└── pom.xml # 仅此一个 POM 文件
Maven工程的目录结构
my-engineering/ # 工程根目录
├── pom.xml # 父 POM(聚合配置)
├── module-a/ # 子模块1
│ ├── src/
│ └── pom.xml
└── module-b/ # 子模块2├── src/└── pom.xml
是不是发现了他们之间的区别了,区别就和SpringBoot和SpringCloud一样。
POM的标签
<!-- 这个是跟标签,里面的内容就是定义了xml版本和其他消息--!>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- POM模型的版本,目前固定就是4.0.0--!><modelVersion>4.0.0</modelVersion>
<!-- 当前项目的,所属公司--!><groupId>com.example</groupId>
<!-- 当前项目的所属项目名称--!><artifactId>demo</artifactId>
<!-- 当前项目的版本号--!><version>1.0.0</version>
<!-- 项目打包类型(默认 jar,可选 war、pom 等)其中pom表示当前是一个父工程,或者叫管理工程,用于管理其他的项目--!><packaging>jar</packaging>
<!-- 属性标签--!><properties>
<!-- 标签是属性名称,里面的是值,表示的是java版本是17,使用${java.version}--!><java.version>17</java.version></properties>
<!-- 依赖父标签,表示下面全是依赖--!><dependencies>
<!-- 依赖子标签--!><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.1.5</version></dependency></dependencies>
<!-- 定义构建相关的配置(如插件、资源目录)--!><build>
<!-- 配置构建插件列表--!><plugins>
<!-- 插件--!><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
以上是没一个项目都会用到的标签,每个都写了注释,大家慢慢看,如果对有些标签有兴趣可以去官网文档查看Maven – POM 参考这边就不多说了。
Maven的生命周期
这个其实是一个抽象的概念,并不是我们所理解的生命周期,和Bean的生命周期是完全不同的概念,Maven的生命周期更想是不同的阶段整合在一起。而每个阶段的不同命令其实是来自于不同的插件,也就是不同的jar包,这个和java的命令是一样的,主包之前讲JVM的时候有给大家演示过。
清理阶段
这个就不用多说了,就是把我们已经打包好、编译好的文件删除掉,也就是target目录下的文件和jar包。
命令 | 执行阶段 | 作用 |
---|---|---|
mvn pre-clean | pre-clean | 执行清理前的预备操作(极少使用) |
mvn clean | clean | 删除target 目录(最常用) |
mvn post-clean | post-clean | 清理后的后续操作(极少使用) |
Default 阶段(核心)
这个就是我们用的比较多的了,流程是validate
:验证项目配置——》compile
:编译主代码——〉test-compile
:编译测试代码——》test
:运行测试——〉package
:打包——》verify
:集成测试检查——〉install部署到本地仓库其他项目可以引用jar包——》deploy
:推送到远处公共/私有仓库,需要在setting.xml中配置私服的用户名和密码,以及在pom.xml配置。我们用的多的也就是package了(打包的时候请把test跳过如果不需要的话)。
命令 | 执行阶段 | 作用 |
---|---|---|
mvn validate | validate | 验证项目配置有效性 |
mvn compile | compile | 编译主代码到target/classes |
mvn test-compile | test-compile | 编译测试代码到target/test-classes |
mvn test | test | 运行单元测试(生成报告到surefire-reports ) |
mvn package | package | 打包(生成JAR/WAR到target/ ) |
mvn verify | verify | 运行集成测试(如maven-failsafe-plugin ) |
mvn install | install | 安装到本地仓库(~/.m2/repository ) |
mvn deploy | deploy | 部署到远程仓库(需配置distributionManagement ) |
Site阶段
生成项目文档(如mvn site
生成target/site
目录),这个用的就更少了会生成一个html文档,这个主包就不演示了。
命令 | 执行阶段 | 作用 |
---|---|---|
mvn pre-site | pre-site | 生成站点前的预备操作 |
mvn site | site | 生成项目文档(target/site ) |
mvn post-site | post-site | 站点生成后的操作 |
mvn site-deploy | site-deploy | 部署站点到服务器 |
当然所以的命令是可以组合使用的,用空格隔开,另外就是上面说过A
依赖 B
,B
依赖 C
,Maven 会自动引入 C那这个是怎么实现的呢?其实我们打开本地的仓库就知道,除了一个jar包外还有个pom文件,maven就是先从A的pom中找到依赖B,下载Bjar的同时会有一个B的pom,再解析B的pom下载C的jar包。
以这个为例,第一个是jar包的来源用于记录依赖项的来源仓库信息,确保后续构建时能快速定位和验证依赖的下载渠道。第二个就是jar包,第三个是jar包的校验文件用于验证对应主文件(如 .jar
或 .pom
)的完整性和一致性,使用的是SHA-1的加密算法生成哈希值。第三个就是pom文件了。
总结
本篇主要介绍了maven的主要功能以及各个生命周期的命令和作用。