【Maven】项目管理工具
Maven:一个项目管理工具
前言
传统项目管理存在的问题:
- 依赖管理混乱
- 需要自己去网上搜 jar 包,找对版本很痛苦(还容易找错)
- 某个库依赖另一个库(传递依赖),你得自己挨个找齐
- 不小心引入多个版本的 jar,运行时会出错(版本冲突)
- 重复劳动严重
- 每个新项目都要手动去复制一堆 jar 包
- jar 包变更后,每台电脑都得手动同步
- 拷来拷去,很容易拷错或漏拷
- 项目臃肿
- 所有依赖都塞进项目 lib/ 目录,体积越来越大
- 压缩打包项目时,把几十个 jar 全打进去,严重拖慢部署速度
- 缺乏标准的构建流程
- 编译、测试、打包步骤全靠人工或写 shell 脚本
- 没有统一规范,团队成员各干各的,出问题互相甩锅
- 测试和生产环境构建出来的包可能不一致
- 依赖冲突难排查
- 不小心引入了多个版本的 jar 包,运行时才发现问题
- 没有依赖树工具,不知道是哪个库带来的冲突
- 团队协作成本高
- 新人加入团队,要手动搭建环境、找依赖
- 打包部署靠经验和习惯,出错风险高
- 无法快速复现线上环境(缺乏统一配置)
Maven的出现 解决了这一切的问题
Maven 提供了:
功能 | 核心价值 |
---|---|
pom.xml 统一配置 | 告别手动管理依赖,实现"配置即文档" |
本地/中央仓库机制 | 自动下载依赖,解决传统方式手动拷贝jar包的问题 |
生命周期 + 插件系统 | 自动化构建、测试、打包,统一团队构建流程 |
依赖树分析 | 通过mvn dependency:tree 快速定位冲突,解决jar包版本兼容问题 |
多模块支持 | 父子POM结构轻松拆分大型项目,实现模块化开发 |
profile 配置 | 一套POM支持多环境(dev/test/prod),避免维护多个配置文件 |
Maven 是什么
简介
- Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model):项目对象模型
作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
POM 是什么
简介
pom 即 pom.xml,是 Maven 项目的核心配置文件,是项目的“说明书”。
作用
- 描述项目基本信息(名称、版本等)
- 声明依赖(告诉 Maven 需要哪些库)
- 定义构建规则(插件、打包方式等)
- 配置构建生命周期(编译→测试→打包)
- 标识是父项目或子模块
最小可运行配置
<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"><!-- 1. 固定的 POM 模型版本,目前只有这个版本,不可修改 --><modelVersion>4.0.0</modelVersion><!-- 2. 唯一标识这个项目的“坐标” --><groupId>com.example</groupId><artifactId>demo</artifactId><version>1.0.0</version></project>
常用标签解析
仓库
- 用于存储资源,包含各种iar包
- 仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用:
- 保存具有版权的资源,包含购买或自主研发的iar
- 中央仓库中的iar都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,仅对内部开放,不对外共享
- 保存具有版权的资源,包含购买或自主研发的iar
坐标
简介及作用
- groupId + artifactId + 版本号统称为坐标,用于在 Maven 仓库中唯一定位项目,可以唯一定位到某个 jar 包
- 类似地图坐标的概念,通过组合值精确定位资源
artifactId
- 项目/模块标识名
- 示例:
tomcat
|spring-core
|myproject-api
groupId
- 组织标识名(采用反向域名规则)
- 分段说明:
- 第一段:域分类
com
(商业组织)|org
(非营利组织)|cn
(国家代码) - 第二段起:组织名称
如:fullstack
|apache
|google
- 第一段:域分类
组合示例
项目示例 | groupId | artifactId | version |
---|---|---|---|
Apache Tomcat | org.apache | tomcat | 3.0.1 |
商业公司项目 | com.fullstack | payment-system | 3.0.1 |
命名规范建议
- groupId 采用小写字母+点分结构
- artifactId 使用小写字母+连字符(kebab-case)
- 确保组合在仓库中全局唯一
项目结构规范
your-project/
├── pom.xml # Maven 主配置文件
├── README.md # 项目说明文档
├── .gitignore # Git 忽略文件配置
├── src/
│ ├── main/
│ │ ├── java/ # 主代码目录
│ │ │ └── com/
│ │ │ └── yourcompany/
│ │ │ └── yourproject/
│ │ │ ├── Application.java # 启动类
│ │ │ ├── controller/ # 控制器
│ │ │ ├── service/ # 服务层
│ │ │ ├── repository/ # DAO/Repository 层
│ │ │ ├── model/ # 实体类或DTO/VO类
│ │ │ ├── config/ # 配置类,如拦截器、跨域、安全、Swagger等
│ │ │ └── utils/ # 工具类
│ │ └── resources/ # 配置与资源文件
│ │ ├── application.yml # Spring Boot 配置
│ │ ├── application-dev.yml
│ │ ├── application-prod.yml
│ │ ├── static/ # 静态资源(前端静态文件:html/js/css/images)
│ │ ├── templates/ # 模板文件(Thymeleaf、Freemarker等)
│ │ └── mapper/ # MyBatis XML 文件
│ ├── test/
│ │ ├── java/ # 测试代码
│ │ │ └── com/
│ │ │ └── yourcompany/
│ │ │ └── yourproject/
│ │ │ └── ApplicationTests.java
│ │ └── resources/ # 测试资源
├── target/ # 编译输出目录(Maven自动生成)