Maven 零基础完整教程

一、先搞懂:Maven 到底解决了什么痛点?

假设你零基础写 Java 项目,会遇到 3 个经典麻烦:

  1. Jar 包地狱:要用 Spring、MySQL 驱动,得手动下载 jar,版本选错就报错;jar 之间还会冲突(A 包需要 log4j1,B 包需要 log4j2)。
  2. 项目结构混乱:有的人代码放 src,有的人新建 java 文件夹,没有统一标准。
  3. 打包、编译麻烦 :编译javac、打包jar命令手动敲,项目大了极其繁琐。

Maven 定位 :Java 项目构建工具 + 依赖管理工具 核心两件事:✅ 依赖管理 :只需要写配置,自动下载 jar、自动解决 jar 冲突✅ 项目构建:一键编译、测试、打包、部署

类比理解:前端的 npm、yarn;Python 的 pip。Maven 就是 Java 界的包管理工具。

二、Maven 核心概念(必须先看懂,不然后续一脸懵)

1. 仓库(Repository)

Maven 所有 jar 包都存放在仓库,分三类:

  1. 本地仓库 :电脑本地文件夹,第一次下载 jar 会保存这里,后续项目直接复用,不用重复下载。 默认路径:C:\Users\用户名\.m2\repository(Windows)
  2. 中央仓库:Maven 官方远程仓库,互联网默认源,全世界共用。缺点:国内访问慢。
  3. 远程仓库(私服 / 镜像)
    • 阿里云 Maven 镜像:国内加速下载(日常开发必配)
    • 公司私服:企业内部存放私有 jar

下载顺序:本地仓库 → 镜像 / 私服 → 中央仓库

2. 坐标 (GAV) --- Maven 定位 Jar 的唯一标识

所有 jar 包通过 3 个参数精准找到,写在 pom.xml 中

复制代码
<!-- GAV三要素 -->
<groupId>组织/公司名(反向域名)</groupId>
<artifactId>项目/模块名称</artifactId>
<version>版本号</version>

示例 MySQL 驱动:

复制代码
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>

3. POM 文件(Project Object Model)

文件名固定:pom.xmlMaven 项目的核心配置文件没有 pom.xml,文件夹就不是 Maven 项目。所有依赖、打包方式、插件、项目配置全部写在这里。

4. 标准 Maven 目录结构(约定优于配置!重点)

Maven 强制一套通用目录,不用自己新建文件夹:

复制代码
项目根目录
├── pom.xml                # 核心配置文件
└── src
    ├── main
    │   ├── java           # 【业务源代码】.java文件
    │   └── resources      # 配置文件:application.properties、xml等
    └── test
        ├── java           # 【单元测试代码】
        └── resources      # 测试环境配置文件

约定优于配置:遵循这套结构,不用写大量配置;如果目录改名,才需要额外配置。

三、环境安装与配置(零基础实操)

1. 安装 Maven

  1. 官网下载:apache-maven 压缩包(选择二进制 bin 包)

  2. 解压到无中文、无空格路径 ,例:D:\software\maven

  3. 配置环境变量

    • MAVEN_HOME = maven 解压目录
    • Path 新增:%MAVEN_HOME%\bin
  4. 验证:打开 cmd 输入

    mvn -v

输出版本信息 = 安装成功

2. 核心配置:settings.xml

路径:maven/conf/settings.xml(全局配置)

重点修改两处:本地仓库路径、阿里云镜像

① 修改本地仓库(可选,建议自定义)
复制代码
<localRepository>D:/maven/repository</localRepository>
② 配置阿里云镜像【最重要!解决下载慢】

找到<mirrors>标签,粘贴:

复制代码
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>central</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

四、Maven 常用命令(cmd / 终端执行)

所有命令格式:mvn 指令必须在 pom.xml 所在文件夹执行

表格

命令 作用
mvn clean clean:清理,删除编译产生的 target 文件夹
mvn compile 编译源代码,生成 class 文件,放在 target
mvn test 执行 test 目录下所有单元测试
mvn package 打包!生成 jar 包 /war 包(存放在 target)
mvn install 打包后,把当前项目 jar 安装到本地仓库,其他项目可以引用
mvn deploy 发布 jar 到远程私服(企业开发使用)

✅ 组合写法(日常高频)

复制代码
# 清理+编译+打包
mvn clean package
# 清理+打包+安装到本地仓库
mvn clean install

target 文件夹:Maven 所有编译、打包输出文件,不要手动修改。

五、pom.xml 详解,从零手写一个最简 pom

最简基础模板

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 固定头部,项目模型版本,不用修改 -->
<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>

    <!-- 当前项目GAV坐标 -->
    <groupId>com.demo</groupId>
    <artifactId>maven-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 打包方式:jar普通Java项目;war web项目;pom父工程 -->
    <packaging>jar</packaging>

    <!-- 项目名称(可选) -->
    <name>Maven入门Demo</name>

    <!-- ======== 依赖区域:所有需要导入的jar包写在这里 ======== -->
    <dependencies>
        <!-- 示例:mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
        
        <!-- Junit单元测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!-- scope:作用范围,test代表只在测试代码生效 -->
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

重点标签:scope(依赖范围,面试高频)

<scope>控制 jar 什么时候生效,4 种常用值:

  1. compile(默认):编译、测试、运行都有效,绝大部分依赖
  2. test:仅单元测试有效,打包不会带入(junit)
  3. provided:编译测试有效,运行时容器提供(例如 servlet-api,tomcat 自带)
  4. runtime:编译无效,运行、测试有效(mysql 驱动)

六、依赖冲突(Maven 最常见问题,架构师重点)

冲突场景

项目 A 引入 log4j1,项目 B 引入 log4j2,两个版本 jar 同时存在,程序直接报错。

Maven 自动调解规则(就近优先)

  1. 路径最短优先:直接引入的包 > 间接传递依赖包
  2. 先声明优先:路径一样,pom.xml 写在前面的版本生效

手动解决冲突

使用<exclusions>排除不需要的传递依赖

复制代码
<dependency>
    <groupId>org.springframeword</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.20</version>
    <!-- 排除内部自动携带的冲突jar -->
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

IDEA 查看依赖树

命令查看依赖树:

复制代码
mvn dependency:tree

可以直观看到所有传递进来的 jar 包,定位冲突。

七、IDEA 整合 Maven(开发必用)

  1. IDEA 新建项目 → 选择 Maven
  2. File → Settings → Build,Execution → Build Tools → Maven
    • Maven home path:选择自己安装的 maven(不要用 IDEA 自带)
    • User settings file:勾选,选择自己的settings.xml
  3. 右侧 Maven 面板,可以直接点击 clean、package 等按钮,不用敲命令

重要提示

修改 pom.xml 后,刷新 Maven 按钮,IDEA 才会自动下载依赖。

八、SNAPSHOT 和 Release 版本区分

  • 1.0-SNAPSHOT:快照版本,开发测试版本,随时更新
  • 1.0:Release 正式稳定版,不会变动企业规范:开发用 Snapshot,上线发布使用 Release

九、高级概念快速预习(零基础先了解,后续进阶)

  1. 父工程 pom(pom 打包):多模块项目统一管理版本,统一定义依赖,避免每个子模块重复写版本号(SpringBoot 底层大量使用)
  2. dependencyManagement:统一管理依赖版本,子模块引入时不用写 version
  3. 多模块项目:大型项目拆分成多个 module(微服务常用)
  4. Maven 插件:编译插件、打包插件、springboot 打包插件spring-boot-maven-plugin

十、零基础入门实操路线(建议跟着动手)

  1. 安装 Maven,配置 settings.xml 阿里云镜像
  2. 手动创建标准 maven 目录结构,新建 pom.xml
  3. 在 dependencies 添加 mysql 依赖
  4. 执行mvn clean compile观察自动下载 jar
  5. 编写简单 Java 代码测试,执行mvn package打包
  6. 导入 IDEA,尝试新增依赖、观察依赖树

常见新手坑总结

  1. pom.xml 路径有中文、空格 → 下载异常
  2. 没配置阿里云镜像 → jar 下载卡住、失败
  3. 命令执行位置不对,不在 pom 同级目录运行 mvn 指令
  4. 依赖 GAV 坐标写错,大小写、名字错误,找不到 jar
  5. 依赖冲突导致启动报错,不会使用 dependency:tree 排查
相关推荐
半夜修仙1 小时前
Spring集成邮箱功能
java·开发语言·spring boot·spring·rabbitmq·github·maven
曾阿伦1 小时前
Maven 构建工程化指南
java·maven
宠友信息1 小时前
从重复请求到订单同步看内容社区源码的处理思路
java·spring boot·redis·后端·mysql·spring
带刺的坐椅1 小时前
用 Solon TeamAgent 落地供应链异常管理与自动补货
java·ai·llm·agent·solon·供应链
潇凝子潇1 小时前
UnsupportedOperationException
java·前端·数据库
码农学院2 小时前
电子产品企业泉州网络推广如何精准触达目标采购商
开发语言·php
qq_33776320192 小时前
国际期货资管系统开发方案|内外盘交易平台源码授权与二次开发支持
java·c语言·开发语言·c++·c#
不定积分要+C_yyy2 小时前
Java关键字final三种用法、核心特性与高频易错点
java·开发语言
xexpertS4 小时前
队列积压治理:如何避免异步系统出现难以恢复的消息积压
java·开发语言