Maven基础

什么是maven

定义:maven是一个项目管理工具,用于项目构建、依赖管理和项目信息管理

核心作用:

依赖管理,自动下载jar包及其依赖

统一结构,规定了代码、配置、源码文件位置

构建自动化,编译 测试 打包 部署

核心关键点

pom (project object model):项目对象模型,就是pom.xml文件,是maven的核心文件

坐标 (coordinates)

groupid 组织公司id

artifactid 项目名

version

仓库(repository)

本地仓库,电脑上存jar包的文件夹

中央仓库,maven官方维护的巨大仓库

远程/私服仓库,公司内部或阿里云镜像

标准的目录结构

src/main/java 放java的远吗

src/main/resources 放配置文件 如properties.xml

src/test/java 放测试代码

target 放编译后的字节码文件

pom.xml 项目目录下的配置文件

pom.xml 详解

基础信息

modelversion

gourpid, artifactid version

packaging 打包方式 war jar pom

dependencies 依赖管理

如何引入依赖 去 mvnrepository.com 搜索并复制 XML)

依赖范围(scope)

compile 默认 编译 测试 运行都有效

test 只有测试时有效 如junit

provoded 编译、测试有效

runtime 编译不需要 运行需要

plugins 插件管理

maven的本质是插件的集合

常用插件 如:maven-compiler-plugin

生命周期和常用命令

clean 清理构建

compile 编译主代码

test 运行测试单元

package 打包

install 把包安装到本地(其他本地项目可以使用)

image.png

deploy 发布到远程仓库

mvn package -DskipTests(只是不执行测试用例,但测试代码还是会编译)

依赖的传递

如果A依赖B B依赖C 那么A自动依赖C

排除依赖可以用

多模块管理(聚合与集成)

父工程 (packaging 为 pom) 管理依赖版本 (dependencyManagement)

子模块继承父工程

image.png

maven 依赖仲裁

黄金法则一:路径优先

maven会看谁离项目根目录最近

路径 A (你的直接引用):

你的项目 -> fastjson (v2.0)

路径长度:1

路径 B (传递依赖):

你的项目 -> C -> B -> A -> fastjson (v1.0)

路径长度:4

结论:1 < 4。因为路径 A 更短,Maven 认为你是故意直接引入的,所以直接采纳 v2.0,完全忽略 v1.0。

黄金法则二:声明顺序优先

如果法则一的路径一样,则看谁先申明的

你的项目 -> X -> log4j (v1.0)
你的项目 -> Y -> log4j (v2.0)
如果你先写 <dependency>X</dependency>,Maven 就用 v1.0

如果你先写 <dependency>Y</dependency>,Maven 就用 v2.0

⚔️ 实战:如何优雅地控制版本?

虽然“路径最短”能解决问题,但在企业级开发中,我们通常用更高级的手段来控制,而不是靠运气或手动排顺序。

方法 1:排除法 ( <exclusions> ) —— “外科手术”

你不想要 A 带进来的低版本 fastjson?那就把它切掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
xml

<dependency>
<groupId>com.example</groupId>
<artifactId>C</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>

这样做比较彻底,但如果依赖链路很长,找起来很累。

方法 2:依赖管理 ( <dependencyManagement> ) —— “尚方宝剑” (最推荐)

这是在父工程或者当前工程里最权威的声明。

只要你在 <dependencyManagement> 里锁定了 fastjson 是 2.0 版本,那么不管底下有多少个 C、B、A 引用了多少个乱七八糟的版本,统统失效,全部强制使用 2.0

1
2
3
4
5
6
7
8
9
10
11
xml

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>

注意:dependencyManagement 只是锁定版本,并不代表引入包。你需要在使用的地方再次引入(不用写版本号)。
maven 其他标签

maven的官方文档 https://maven.apache.org/pom.html#Distribution_Management


上一章 目录 下一章
IDE使用(IDEA) java基础 [hello world](/2026/04/04/hello world/)