当前位置: 首页 > news >正文

Maven(一)

首先我们要知道什么是Maven?他是干什么的?我相信大家对Maven并不陌生了,但大多数同学只是停留在要用而用的层面上,也就是大概知道他是干什么的,但真发生依赖冲突了那就无从下手了。Apache Maven​ 是一个 ​Java 项目构建和依赖管理工具,主要用于:​自动化构建​(编译、测试、打包、部署)。依赖管理​(自动下载和管理第三方库)。标准化项目结构​(约定优于配置)。

核心特点

  1. 基于 POM(Project Object Model)​​:通过 pom.xml 文件定义项目配置。
  2. 依赖传递性​:自动解析并下载依赖的依赖(如 A 依赖 BB 依赖 C,Maven 会自动引入 C)。
  3. 构建生命周期​:提供标准化的构建阶段(如 cleancompilepackage)。
  4. 插件体系​:通过插件扩展功能(如 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 packagemvn 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-cleanpre-clean执行清理前的预备操作(极少使用)
mvn cleanclean删除target目录​(最常用)
mvn post-cleanpost-clean清理后的后续操作(极少使用)

Default 阶段(核心)

这个就是我们用的比较多的了,流程是validate:验证项目配置——》compile:编译主代码——〉test-compile:编译测试代码——》test:运行测试——〉package:打包——》verify:集成测试检查——〉install部署到本地仓库其他项目可以引用jar包——》deploy:推送到远处公共/私有仓库,需要在setting.xml中配置私服的用户名和密码,以及在pom.xml配置。我们用的多的也就是package了(打包的时候请把test跳过如果不需要的话)。

命令执行阶段作用
mvn validatevalidate验证项目配置有效性
mvn compilecompile编译主代码target/classes
mvn test-compiletest-compile编译测试代码到target/test-classes
mvn testtest运行单元测试​(生成报告到surefire-reports
mvn packagepackage打包​(生成JAR/WAR到target/
mvn verifyverify运行集成测试(如maven-failsafe-plugin
mvn installinstall安装到本地仓库​(~/.m2/repository
mvn deploydeploy部署到远程仓库(需配置distributionManagement

 ​Site阶段

生成项目文档(如mvn site生成target/site目录),这个用的就更少了会生成一个html文档,这个主包就不演示了。

命令执行阶段作用
mvn pre-sitepre-site生成站点前的预备操作
mvn sitesite生成项目文档​(target/site
mvn post-sitepost-site站点生成后的操作
mvn site-deploysite-deploy部署站点到服务器

当然所以的命令是可以组合使用的,用空格隔开,另外就是上面说过A 依赖 BB 依赖 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的主要功能以及各个生命周期的命令和作用。

http://www.dtcms.com/a/338066.html

相关文章:

  • 做一个答题pk小程序多少钱?
  • 《红色脉-络:一部PLMN在中国的演进史诗 (1G-6G)》 第6篇 | 专题:核心网的第一次革命——从电路交换到“用户/控制面分离”
  • java17学习笔记-增强型伪随机数生成器
  • LeetCode100-438找到字符串中所有的字母异位词
  • 上网行为管理之用户认证技术和应用控制技术
  • 开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案
  • 具身智能3全身动力学控制软件包(人形机器人)摘自Openloong社区
  • N32G430C8-串口驱动问题
  • MATLAB的实用字母识别系统实现含GUI界面
  • 软件在线安装和离线安装
  • c/c++标准库
  • GISer大事件,保研考研竞赛时间线一览
  • Java中的128陷阱:深入解析Integer缓存机制及应对策略
  • 为什么体育应用离不开 API?数据接入基础指南
  • ae关键帧路径显示不完全怎么办
  • Linux 服务:RAID 级别解析与 mdadm 工具实操指南
  • 【Vue】Vue3检测滚动到底部
  • week2-[循环嵌套]数位和为m倍数的数
  • 牛客周赛 Round 105(小苯的xor构造/小苯的权值计算/小苯的01矩阵构造/小苯的重排构造/小苯的xor图/小苯的前缀gcd构造)
  • 【石油化工行业SAP整体解决方案内容总结】
  • 直播平台如何集成美颜SDK与动态贴纸?开发流程与实战指南
  • 场外期权的股票停牌了怎么处理?
  • 【tips】unsafe-eval线上页面突然空白
  • 基于Transformer+多模态图像融合取得最新突破的创新点分析
  • diffuxers学习--AutoPipeline
  • 申请免费的SSL证书,到期一键续签
  • 从 ORA-12703 到顺利入库:Go + Oracle 11g GBK 字符集踩坑记20250818
  • 【数据结构】深入理解双向链表:结构、实现与对比分析
  • 【DDIA】第十章:解析Reduce端连接与分组技术
  • Java基础 8.18