二十、框架学习(maven)

5 阅读7分钟

Maven 超详细全知识点整理

一、Maven 基础认知

1. 什么是 Maven

Maven 是 Apache 开源的项目管理和构建工具,基于 POM (Project Object Model,项目对象模型) 统一管理 Java 项目的:

  • 编译
  • 测试
  • 打包
  • 依赖管理
  • 部署
  • 文档生成

2. Maven 核心作用

  1. 标准化项目结构:所有 Maven 项目目录结构一致
  2. 自动依赖管理:自动下载 jar 包 + 处理依赖传递 + 解决冲突
  3. 一键构建项目:一条命令完成编译、测试、打包、部署
  4. 跨平台:Windows/Linux/Mac 通用
  5. 插件化扩展:支持编译、测试、打包、代码检查等插件

3. Maven 与 Ant/Gradle 区别

工具特点
Ant无规范、无依赖管理、配置繁琐
Maven约定大于配置、依赖管理、生命周期标准化
Gradle基于 Maven,兼容 Maven,DSL 语法更灵活

二、Maven 安装与环境配置

1. 下载 Maven

官网:maven.apache.org/ 版本选择:3.8.x / 3.9.x(稳定版)

2. 环境变量配置

Windows
  1. 解压 Maven 到无中文路径
  2. 新建系统变量:
    • 变量名:MAVEN_HOME
    • 变量值:Maven 解压路径
  3. 编辑 Path:添加 %MAVEN_HOME%\bin
  4. 验证:cmd 输入 mvn -v
Linux/Mac
# 解压
tar -zxvf apache-maven-xxx.tar.gz -C /usr/local/

# 配置环境变量
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-xxx
export PATH=$PATH:$MAVEN_HOME/bin

# 生效
source /etc/profile

# 验证
mvn -v

3. Maven 目录结构

apache-maven-xxx/
├── bin/      # 命令脚本(mvn、mvn.cmd)
├── boot/     # 类加载器
├── conf/     # 核心配置文件(settings.xml)
├── lib/      # 依赖 jar
└── LICENSE

三、Maven 核心配置文件

1. 两个核心配置文件

  1. settings.xml(全局配置)
    • 位置1:maven/conf/settings.xml(全局)
    • 位置2:用户目录/.m2/settings.xml(用户级,优先级更高)
  2. pom.xml(项目配置)
    • 每个项目独有,定义项目信息、依赖、插件

2. settings.xml 核心配置

(1)本地仓库配置
<localRepository>D:\maven_repository</localRepository>
  • 用于存储所有下载的 jar 包,默认:C:\Users\用户名.m2\repository
(2)阿里云镜像(必须配置!)

解决下载慢、下载失败问题:

<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>
(3)JDK 版本配置

全局默认编译 JDK:

<profiles>
    <profile>
        <id>jdk1.8</id>
        <activation>
            <jdk>1.8</jdk>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>
</profiles>
(4)私服配置(企业必备)
<servers>
    <server>
        <id>nexus-releases</id>
        <username>admin</username>
        <password>123456</password>
    </server>
    <server>
        <id>nexus-snapshots</id>
        <username>admin</username>
        <password>123456</password>
    </server>
</servers>

四、Maven 标准项目结构(约定大于配置)

1. 单模块项目结构

项目名/
├── pom.xml              # 核心配置文件
├── src/
│   ├── main/            # 主程序
│   │   ├── java/        # Java 源代码
│   │   ├── resources/   # 配置文件(mybatis、application.yml)
│   │   └── webapp/      # Web 项目页面(jsp、css、js)
│   └── test/            # 测试程序
│       ├── java/        # 测试代码
│       └── resources/   # 测试配置
└── target/              # 编译输出目录(class、jar、war)

2. 约定大于配置(Convention over Configuration)

Maven 提前规定好目录、文件、插件位置,不用手动配置,减少冗余配置。


五、POM.xml 核心标签详解

1. 基础信息标签

<!-- 项目坐标:唯一标识 -->
<groupId>com.company</groupId>    <!-- 公司/组织域名(反写) -->
<artifactId>demo-project</artifactId> <!-- 项目名/模块名 -->
<version>1.0.0</version>          <!-- 版本号 -->
<packaging>jar</packaging>        <!-- 打包方式:jar/war/pom -->
<name>demo</name>                 <!-- 项目名 -->
<description>测试项目</description>

2. 版本号规范

  • SNAPSHOT快照版本(开发中,不稳定,每次更新)
  • RELEASE正式版本(稳定,发布后不修改) 示例:1.0.0-SNAPSHOT2.1.0-RELEASE

3. 依赖管理核心标签

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>    <!-- 依赖范围 -->
        <optional>false</optional> <!-- 是否可选依赖 -->
    </dependency>
</dependencies>

4. 依赖范围(scope)6 种(高频面试)

scope主程序测试打包说明
compile默认值,编译运行都需要
test仅测试(JUnit)
provided已由容器提供(Servlet API)
runtime运行时需要(JDBC 驱动)
system本地 jar,不下载
import仅在 dependencyManagement 中使用

5. 继承与聚合标签

(1)父工程 pom
<packaging>pom</packaging>

<!-- 子模块 -->
<modules>
    <module>demo-common</module>
    <module>demo-web</module>
</modules>

<!-- 统一管理版本 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.company</groupId>
            <artifactId>demo-common</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
(2)子模块 pom
<parent>
    <groupId>com.company</groupId>
    <artifactId>demo-parent</artifactId>
    <version>1.0.0</version>
    <relativePath>../pom.xml</relativePath>
</parent>

6. 构建插件标签

<build>
    <plugins>
        <!-- 编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

六、Maven 依赖机制(核心重点)

1. 依赖传递

A 依赖 B,B 依赖 C → A 自动依赖 C 示例:Spring-core → commons-logging

2. 依赖冲突解决原则(面试必问)

当同一个 jar 出现多个版本时,Maven 自动解决冲突:

  1. 路径优先:依赖路径越短,优先级越高
  2. 声明优先:路径相同,pom.xml 中先声明的优先
  3. 覆写优先:子 pom 优先于父 pom

3. 排除依赖(exclusions)

手动排除不需要的传递依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.23</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4. 统一版本管理(dependencyManagement)

  • 父工程定义版本,子工程直接引用,不实际引入依赖
  • 作用:统一管理项目所有依赖版本,避免冲突

七、Maven 生命周期与命令

1. 三套独立生命周期

Maven 有 3 套生命周期,互相独立:

  1. clean:清理项目
  2. default:核心构建(编译、测试、打包、部署)
  3. site:生成项目站点

2. 生命周期阶段(执行后面会自动执行前面)

(1)clean 生命周期
pre-clean → clean → post-clean
  • clean:删除 target 目录
(2)default 生命周期(最重要)
validate → compile → test → package → install → deploy
  1. compile:编译 src/main/java
  2. test:运行测试代码
  3. package:打包成 jar/war
  4. install:安装到本地仓库
  5. deploy:部署到私服
(3)site 生命周期

生成项目文档、报告

3. 常用 Maven 命令(工作必备)

# 清理
mvn clean

# 编译
mvn compile

# 测试
mvn test

# 打包
mvn package

# 安装到本地仓库
mvn install

# 部署到私服
mvn deploy

# 清理+打包
mvn clean package

# 跳过测试打包
mvn clean package -Dmaven.test.skip=true

4. 命令与生命周期关系

执行一个阶段,自动执行前面所有阶段 例如:执行 mvn install → 自动执行 compile、test、package


八、Maven 插件机制

Maven 本身不执行构建,所有功能都由插件完成

1. 常用插件

  1. maven-compiler-plugin:编译 Java 代码
  2. maven-surefire-plugin:运行测试
  3. maven-jar-plugin:打 jar 包
  4. maven-war-plugin:打 war 包
  5. spring-boot-maven-plugin:SpringBoot 可执行 jar
  6. maven-resources-plugin:处理资源文件

2. 插件目标(goal)

每个插件包含多个目标,例如:

  • compiler:compile:编译主代码
  • compiler:testCompile:编译测试代码

九、Maven 多模块项目(企业开发标准)

1. 结构规范

parent-project(pom)
├── common(jar)   # 工具类、实体类
├── dao(jar)      # 数据访问
├── service(jar)   # 业务逻辑
└── web(war)      # 控制器、前端

2. 优势

  1. 代码解耦:分工明确
  2. 复用性高:common 被所有模块依赖
  3. 统一版本:父工程管理所有依赖版本
  4. 一键构建:父工程执行命令,所有模块自动构建

十、Maven 私服(Nexus)

1. 什么是私服

企业内部搭建的 Maven 仓库服务器,用于:

  • 缓存中央仓库 jar,加速下载
  • 存储公司内部私有 jar
  • 统一管理依赖,安全可控

2. Nexus 仓库类型

  1. hosted:宿主仓库(公司内部 jar)
    • releases:正式版
    • snapshots:快照版
  2. proxy:代理仓库(代理中央仓库、阿里云)
  3. group:仓库组(统一入口,包含以上所有)

3. 项目配置私服

<repositories>
    <repository>
        <id>nexus</id>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases><enabled>true</enabled></releases>
        <snapshots><enabled>true</enabled></snapshots>
    </repository>
</repositories>

<!-- 部署配置 -->
<distributionManagement>
    <repository>
        <id>nexus-releases</id>
        <url>http://localhost:8081/repository/releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <url>http://localhost:8081/repository/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

十一、Maven 高级特性

1. 动态版本号

<version>[1.0,2.0)</version>  # 1.0 ≤ 版本 < 2.0
<version>1.0.+</version>      # 最新补丁版

2. 多环境切换(profile)

开发/测试/生产环境切换:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>dev</env>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

命令:mvn clean package -Pdev

3. 依赖分析命令

# 查看依赖树
mvn dependency:tree

# 分析依赖冲突
mvn dependency:analyze

十二、Maven 常见问题与解决方案

1. 下载 jar 失败

  • 解决方案:删除仓库里 .lastUpdated 文件,配置阿里云镜像

2. 依赖冲突

  • 解决方案:dependency:tree 查看冲突,使用 exclusions 排除

3. 编译版本错误

  • 解决方案:pom 中指定 JDK 版本 1.8

4. 打包后配置文件无法读取

  • 解决方案:resources 插件配置过滤

十三、Maven 高频面试题

  1. Maven 的核心概念?
  2. 依赖范围 scope 有哪些?
  3. 依赖冲突解决原则?
  4. Maven 生命周期有哪些?
  5. 什么是 SNAPSHOT 版本?
  6. dependencyManagement 与 dependencies 区别?
  7. Maven 私服作用?
  8. 如何排除传递依赖?