Maven进阶

Maven进阶

Maven 是一个 项目管理工具,主要解决三件事:

  • 依赖管理
  • 项目构建
  • 项目信息管理

帮 Java 项目统一"怎么下依赖、怎么编译、怎么测试、怎么打包、怎么发布"的工具。

约定大于配置

Maven 非常强调这个思想。

比如它约定:

  • 主代码放 src/main/java
  • 资源文件放 src/main/resources
  • 测试代码放 src/test/java
  • 测试资源放 src/test/resources
  • 打包输出到 target

所以你只要按规范来,很多配置根本不用写。

这就是为什么 Maven 项目结构几乎长得都一样。

依赖坐标唯一标识

Maven 里的一个 jar,不是靠文件名识别,而是靠一组坐标:

  • groupId
  • artifactId
  • version

例如:

复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.30</version>
</dependency>

这三个东西共同确定一个依赖。

面试里经常问:
Maven 如何唯一确定一个构件?

答案就是:
GAV 坐标:groupId + artifactId + version

Maven 的安装与目录结构

Maven 本身是 Java 写的,所以运行 Maven 需要 JDK。

一般先配:

  • JAVA_HOME
  • MAVEN_HOME
  • PATH

验证命令:

复制代码
mvn -v
  • bin:启动脚本
  • conf:全局配置文件,比如 settings.xml
  • lib:Maven 自己依赖的 jar

Maven 项目的标准目录结构

java 复制代码
project
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   ├── resources
│   │   └── webapp
│   └── test
│       ├── java
│       └── resources
└── target

pom.xml 是什么

pom 全称:

Project Object Model

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
         http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo</groupId>
    <artifactId>maven-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

modelVersion

POM 模型版本,通常固定 4.0.0

groupId

组织、公司、团队、项目域名反写。

比如:

复制代码
<groupId>com.company.project</groupId>

artifactId

模块名、项目名。

比如:

复制代码
<artifactId>user-service</artifactId>

version

当前项目版本。

例如:

  • 1.0.0
  • 1.0-SNAPSHOT

packaging

表示打包方式。

常见值:

  • jar
  • war
  • pom

例子:

复制代码
<packaging>jar</packaging>

jarwarpom 区别?

  • jar:普通 Java 项目
  • war:Web 项目
  • pom:父工程/聚合工程,不直接放业务代码打包运行

依赖管理 dependencies

基本写法

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.30</version>
    </dependency>
</dependencies>

依赖就是:

当前项目在编译、测试、运行过程中需要用到的外部构件。

依赖的关键属性

属性名 是否必须 作用 说明/特点 面试关键点
groupId 标识组织/公司 类似包名(反域名) GAV 三要素之一
artifactId 标识模块/项目 jar 名(不含版本) 在 group 内唯一
version 指定版本 SNAPSHOT / RELEASE GAV 唯一定位
scope 控制依赖生效范围 compile/test/provided/runtime 控制 classpath
optional 是否可选依赖 true 时不向下传递 阻断依赖传递
exclusions 排除传递依赖 精确移除某个依赖 解决冲突常用
type 指定依赖类型 默认 jar 可为 war、pom 等
classifier 构件分类标识 如 sources、javadoc 区分同一构件变体
systemPath 本地依赖路径 配合 system scope 使用 ⚠️不推荐
optional(传递影响) 控制传递行为,自己用 不会传递给依赖方 面试加分点

依赖作用域 scope

scope 编译(main) 测试(test) 运行(runtime) 是否打包 典型场景
compile(默认) Spring、工具类
test JUnit、Mockito
provided Servlet API(容器提供)
runtime JDBC 驱动
scope 什么时候用
compile 全流程都需要 业务核心依赖
test 只在测试用 单元测试
provided 编译需要,运行环境提供 Web 容器依赖
runtime 编译不需要,运行需要 数据库驱动

依赖传递

如果你依赖 A,而 A 又依赖 B,那么通常你也会自动得到 B。

这就叫:

Transitive Dependency,传递依赖。

看依赖树

复制代码
mvn dependency:tree

依赖冲突

冲突怎么来的,比如

复制代码
项目 -> A -> B 1.0
项目 -> C -> B 2.0

Maven 的冲突解决策略

第一条:最近优先

谁离当前项目更近,优先用谁。

例如:

复制代码
项目 -> A -> B 1.0
项目 -> B 2.0

最终一般选 B 2.0,因为直接依赖路径更短。


第二条:路径相同,先声明优先

如果路径长度相同,谁先写在 POM 里,谁优先。

怎么解决冲突

常见手段:

  • 显式指定版本
  • 使用 dependencyManagement
  • 使用 exclusions 排除不想要的依赖
  • dependency:tree 分析来源

仓库机制

本地仓库

默认在用户目录下:

复制代码
~/.m2/repository

作用:

  • 缓存下载过的依赖
  • 避免每次联网下载
  • 支持安装自己构建的 jar

中央仓库

Maven 官方默认远程仓库。

如果本地没有依赖,就去远程仓库下载。


私服

公司内部一般会搭私服,比如 Nexus、Artifactory。

作用:

  • 缓存外部依赖
  • 存储公司内部 jar
  • 控制依赖下载来源
  • 提高下载速度和安全性

生命周期

validate

检查项目是否正确,配置是否完整。

compile

编译主代码。

test

执行测试。

package

打包,生成 jar/war。

install

安装到本地仓库。

deploy

发布到远程仓库。

相关推荐
专注VB编程开发20年3 小时前
工控上位机开发为什么固死.net 4.5.2sdk?适配win7
python·信息可视化·c#
CC数学建模3 小时前
2026第八届中青杯全国大学生数学建模竞赛C题:情绪维度耦合约束的脑电信号情绪识别 (1)完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
Kobebryant-Manba3 小时前
安装cuda
pytorch·python·深度学习·conda·numpy
小何code3 小时前
【Python零基础入门】第10篇:Python列表方法与应用实例
数据库·人工智能·python
CC数学建模3 小时前
2026第八届中青杯全国大学生数学建模竞赛B题:AI生成内容的质量评估与参数优化完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
神仙别闹3 小时前
基于 Python 实现 ANN 与 KNN 的图像分类
开发语言·python·分类
极客笔记Jack3 小时前
Scanpy 高级可视化:从默认配色到发表级图表
python
SilentSamsara3 小时前
高并发 API 压测与调优:locust + 火焰图 + 瓶颈定位
开发语言·python·青少年编程·docker·中间件
财经资讯数据_灵砚智能3 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月4日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
用户67573181940253 小时前
两个Bot不能聊天,我让它们自己建了一条高速公路
python