17 Maven

✨博客主页: https://blog.csdn.net/m0_63815035?type=blog

💗《博客内容》:大数据、AI开发、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识
📢博客专栏: https://blog.csdn.net/m0_63815035/category_11954877.html
📢欢迎点赞 👍 收藏 ⭐留言 📝
📢本文为学习笔记资料,如有侵权,请联系我删除,疏漏之处还请指正🙉
📢大厦之成,非一木之材也;大海之阔,非一流之归也✨

目录

    • [一、为什么需要 Maven](#一、为什么需要 Maven)
    • [二、Maven 概述](#二、Maven 概述)
      • [2.1 什么是 Maven](#2.1 什么是 Maven)
      • [2.2 构建环节(生命周期阶段)](#2.2 构建环节(生命周期阶段))
      • [2.3 工作原理](#2.3 工作原理)
      • [2.4 坐标(GAV)](#2.4 坐标(GAV))
    • [三、Maven 环境配置](#三、Maven 环境配置)
      • [3.1 前提](#3.1 前提)
      • [3.2 安装 Maven](#3.2 安装 Maven)
      • [3.3 配置本地仓库和镜像](#3.3 配置本地仓库和镜像)
      • [3.4 配置 JDK 编译版本](#3.4 配置 JDK 编译版本)
    • [四、IDEA 集成 Maven](#四、IDEA 集成 Maven)
      • [4.1 IDEA 中配置 Maven](#4.1 IDEA 中配置 Maven)
      • [4.2 创建 Maven Java 项目](#4.2 创建 Maven Java 项目)
      • [4.3 创建 Maven Web 项目](#4.3 创建 Maven Web 项目)
    • [五、Maven 核心概念](#五、Maven 核心概念)
      • [5.1 POM(Project Object Model)](#5.1 POM(Project Object Model))
      • [5.2 仓库](#5.2 仓库)
      • [5.3 依赖管理](#5.3 依赖管理)
      • [5.4 依赖传递性](#5.4 依赖传递性)
      • [5.5 属性(Properties)](#5.5 属性(Properties))
      • [5.6 继承(Parent)](#5.6 继承(Parent))
      • [5.7 聚合(Modules)](#5.7 聚合(Modules))
    • 六、多模块项目示例(CRM)
    • [七、常用 Maven 命令](#七、常用 Maven 命令)
    • 八、常见问题
    • 九、结尾

Maven 是 Java 项目的构建和依赖管理工具。本文从实际开发痛点出发,讲解 Maven 的核心概念、环境搭建、IDEA 集成、依赖管理、生命周期以及多模块项目拆分等内容,适合入门和日常参考。


一、为什么需要 Maven

在 Maven 出现之前,Java 项目开发中存在以下问题:

  1. 一个项目就是一个工程

    项目庞大时不适合用 package 划分模块,每个模块最好独立为一个项目,方便分工和部署。

  2. jar 包需要手动复制

    每个项目都要把 jar 拷贝到 WEB-INF/lib 目录,多个项目重复存放同一 jar,浪费空间且工程臃肿。

    Maven 将 jar 统一存放在本地仓库,项目只需引用,无需复制。

  3. jar 包下载不规范

    不同技术网站的 jar 下载方式各异,Maven 通过中央仓库提供统一规范下载。

  4. jar 包的依赖关系需要手动维护

    一个 jar 可能依赖其他 jar,手动添加容易遗漏或冲突,Maven 能自动解析和传递依赖。


二、Maven 概述

2.1 什么是 Maven

Maven 是 Apache 的开源项目,基于 项目对象模型(POM) ,通过一小段描述信息管理项目的构建、报告和文档。它是一套自动构建工具 ,也是依赖管理工具

2.2 构建环节(生命周期阶段)

阶段 命令 说明
清理 mvn clean 删除以前编译的 class 文件
编译 mvn compile 将 Java 源程序编译成 class 字节码
测试 mvn test 自动运行 JUnit 测试
报告 - 测试结果报告(自动生成)
打包 mvn package 将编译后的代码打包成 jar 或 war
安装 mvn install 将打包文件复制到本地仓库
部署 mvn deploy 将 war 包复制到服务器并运行

2.3 工作原理

Maven 采用**本地仓库 + 远程仓库(中央仓库/私服)**的结构:

  • 本地仓库:默认在 ~/.m2/repository,存放已下载的 jar。
  • 中央仓库:由 Maven 官方维护,包含大部分开源组件。
  • 私服:公司内部搭建的私有仓库,用于共享内部组件或缓存中央仓库。

当项目需要某个 jar 时,Maven 先从本地仓库查找,若没有则从中央仓库(或镜像/私服)下载到本地。

镜像(mirror)相当于拦截器,可将对中央仓库的请求重定向到国内镜像(如阿里云),提高下载速度。

2.4 坐标(GAV)

Maven 使用坐标唯一定位一个构件(jar 包):

元素 说明 示例
groupId 组织/公司标识 com.alibaba
artifactId 项目/模块名 fastjson
version 版本号 1.2.83
packaging 打包类型(jar/war/pom) jar
classifier 分类(如源码、文档) sources

本地仓库的目录结构即按 groupId/artifactId/version 组织。


三、Maven 环境配置

3.1 前提

  • 已安装 JDK,并配置 JAVA_HOME 环境变量。

3.2 安装 Maven

  1. 下载 Maven(如 apache-maven-3.8.x-bin.zip),解压到无中文无空格的路径,例如 D:\DevTools\apache-maven-3.8.1
  2. 配置环境变量:
    • 新建 MAVEN_HOME = D:\DevTools\apache-maven-3.8.1
    • Path 中添加 %MAVEN_HOME%\bin
  3. 验证:命令行执行 mvn -v,显示版本信息即成功。

3.3 配置本地仓库和镜像

修改 Maven 安装目录下的 conf/settings.xml

xml 复制代码
<!-- 配置本地仓库路径(默认在用户目录/.m2/repository) -->
<localRepository>D:/DevTools/server/repository</localRepository>

<!-- 配置阿里云镜像,加速下载 -->
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    <mirrorOf>central</mirrorOf>
</mirror>

3.4 配置 JDK 编译版本

默认 Maven 使用 JDK 1.5,需在 settings.xml<profiles> 中添加:

xml 复制代码
<profile>
    <id>jdk1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </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>

四、IDEA 集成 Maven

4.1 IDEA 中配置 Maven

  1. 打开 File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven
  2. 设置:
    • Maven home directory:Maven 安装目录
    • User settings file :指定 settings.xml 文件(可勾选 Override)
    • Local repository:自动读取 settings 中的配置,也可手动指定

4.2 创建 Maven Java 项目

  • 新建 Module → Maven → 勾选 Create from archetype → 选择 maven-archetype-quickstart
  • 输入 GAV 信息,完成创建。

默认目录结构:

复制代码
项目名/
├── src/
│   ├── main/
│   │   └── java/        # 主程序源码
│   └── test/
│       └── java/        # 测试源码
├── target/              # 编译输出目录
└── pom.xml              # 项目核心配置文件

4.3 创建 Maven Web 项目

  • 新建 Module → Maven → 勾选 Create from archetype → 选择 maven-archetype-webapp
  • 输入 GAV 信息,完成创建。
  • Web 项目需要配置 Tomcat 运行,或使用 Maven 插件(不推荐)。

五、Maven 核心概念

5.1 POM(Project Object Model)

pom.xml 是 Maven 项目的核心配置文件,包含:

  • 项目基本信息(GAV、name、url)
  • 依赖列表(<dependencies>
  • 构建插件配置
  • 父项目信息(<parent>
  • 属性定义(<properties>

5.2 仓库

仓库类型 说明
本地仓库 本机目录,存放下载的 jar
中央仓库 Maven 官方仓库,位于 https://repo.maven.apache.org/maven2
镜像 对中央仓库的加速镜像,如阿里云、华为云
私服 公司内部仓库(如 Nexus),用于共享内部组件或缓存

5.3 依赖管理

pom.xml 中通过 <dependency> 引入 jar:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.3</version>
        <scope>compile</scope>   <!-- 默认 compile -->
    </dependency>
</dependencies>
依赖作用域(scope)
scope 主程序 测试程序 参与打包 典型场景
compile(默认) 生效 生效 常规 jar
test 不生效 生效 JUnit
provided 生效 生效 servlet-api(Tomcat 已提供)
system 生效 生效 本地 jar(需指定 systemPath

5.4 依赖传递性

如果 A 依赖 B,B 依赖 C,则 A 会自动依赖 C(除非 C 的 scope 是 testprovided)。

Maven 通过最短路径原则最先声明原则处理版本冲突。

排除依赖

当传递的依赖不是所需版本时,可排除:

xml 复制代码
<dependency>
    <groupId>org.example</groupId>
    <artifactId>ref-v1</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.example</groupId>
            <artifactId>unwanted</artifactId>
        </exclusion>
    </exclusions>
</dependency>

5.5 属性(Properties)

定义变量统一管理版本号:

xml 复制代码
<properties>
    <hutool.version>5.7.3</hutool.version>
</properties>

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>${hutool.version}</version>
    </dependency>
</dependencies>

5.6 继承(Parent)

父项目(packaging 为 pom)在 <dependencyManagement> 中声明依赖的版本,子项目只需引入 groupIdartifactId,无需指定 version(也可不写 scope,继承自父)。

父项目 pom:

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>

子项目 pom:

xml 复制代码
<parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0</version>
</parent>

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
    </dependency>
</dependencies>

若父子项目在同一目录层级,父项目需使用相对路径 <relativePath>

5.7 聚合(Modules)

将多个子模块组织在一个父项目中,实现统一构建。父项目 pom.xml 中声明:

xml 复制代码
<modules>
    <module>maven_crm_domain</module>
    <module>maven_crm_dao</module>
    <module>maven_crm_service</module>
    <module>maven_crm_web</module>
</modules>

执行 mvn install 父项目时,所有子模块会按顺序被构建。


六、多模块项目示例(CRM)

按照分层或模块拆分,典型结构:

复制代码
maven_crm (父项目,pom)
├── maven_crm_domain (jar)
├── maven_crm_dao (jar)  → 依赖 domain
├── maven_crm_service (jar) → 依赖 dao
└── maven_crm_web (war) → 依赖 service

每个子模块的 pom.xml 继承父项目,并声明所需依赖(不写版本号时从父项目继承)。

这样做的好处:

  • 统一管理依赖版本
  • 统一构建整个项目
  • 模块间边界清晰,便于维护

七、常用 Maven 命令

命令 说明
mvn clean 删除 target 目录
mvn compile 编译主程序
mvn test-compile 编译测试程序
mvn test 执行测试
mvn package 打包(jar/war)
mvn install 安装到本地仓库
mvn deploy 部署到远程仓库(私服)
mvn dependency:tree 查看依赖树

八、常见问题

  1. 下载慢:配置阿里云镜像。
  2. 编译版本过低 :在 pom.xmlsettings.xml 中指定 JDK 版本。
  3. IDEA 中 Maven 不生效:检查 IDEA 的 Maven 设置,是否覆盖了本地 settings。
  4. jar 包冲突 :使用 mvn dependency:tree 查看依赖树,利用 <exclusions> 排除。
  5. web 项目无法运行 :配置 Tomcat 运行,或使用 mvn tomcat7:run 插件(注意版本兼容)。

九、结尾

Maven 主要解决了 Java 项目的两个核心问题:

  • 构建自动化:规范了项目结构,提供了生命周期命令。
  • 依赖管理:通过坐标和仓库统一管理 jar,自动传递依赖。

掌握 Maven 是学习 Spring Boot 等框架的基础。建议多动手创建 Maven 项目,理解 pom.xml 中各个标签的作用,熟练使用常用命令。

csharp 复制代码
今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文
相关推荐
C+-C资深大佬1 小时前
C++ 数字与字符串互转
java·c++·算法
陈猪的杰咪1 小时前
DeepSeek V4 中转方案全解析 | Flash 成本仅为 GPT 的 1/90
java·人工智能·gpt·spring
zlpzlpzyd1 小时前
spring boot 4.1发布
java·数据库·spring boot
无籽西瓜a1 小时前
Plan-and-Execute 里的 DAG 是怎么工作的
java·后端·ai·agent·dag
ch.ju1 小时前
Java Programming Chapter 4——The difference between overloading and overwriting.
java·开发语言
我命由我123451 小时前
Android 开发问题:View 的 getWidth、getHeight 方法返回的值都为 0
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
满怀冰雪1 小时前
第12篇-二分答案法-当答案不好求时如何反向搜索
java·算法
我登哥MVP1 小时前
SpringCloud 核心组件解析:服务网关
java·spring boot·后端·spring·spring cloud·java-ee·maven
lulu12165440781 小时前
OpenAI 如何用开源前端生态为 GPT-5.6 铺路? - 微元算力(weytoken)
java·前端·人工智能·python·gpt·开源·ai编程