Maven基础入门学习笔记
一、这一章在讲什么
这一章主要学习 Maven 的基础用法:Maven 是什么、项目结构怎么组织、pom.xml 怎么看、依赖怎么配置、生命周期命令怎么执行。Maven 可以理解为 Java 项目的"项目管家",负责管理项目结构、依赖 jar 包、编译、测试、打包等工作。结合 demo 项目来看,核心就是通过 pom.xml 描述项目,通过 src/main/java 存放源码,通过 target 保存构建结果。初学 Maven 时,最重要的是先理解 Maven 坐标、依赖配置和生命周期。
二、核心概念
1. Maven 是什么
-
它是什么
- Maven 是 Java 项目的构建和依赖管理工具。
- 它可以帮我们统一管理项目结构、第三方 jar 包、编译、测试、打包等流程。
-
有什么作用
- 不用手动下载和管理一堆 jar 包;
- 不用手动配置复杂的编译、打包流程;
- 让 Java 项目有统一的目录规范和构建方式。
-
它的原理
- Maven 会读取项目根目录下的
pom.xml; - 根据
pom.xml中的配置,下载依赖、执行插件、完成编译打包; - 构建结果默认放到
target目录。
- Maven 会读取项目根目录下的
-
容易混淆的点
- Maven 不是 Java 语法;
pom.xml不是 Java 代码,而是 Maven 配置文件;- Maven 主要是帮项目"管理和构建",不是用来直接写业务逻辑的。
2. Maven 项目结构
以 demo 项目为例,结构大致是:
text
demo
├── pom.xml
├── src
│ └── main
│ └── java
│ └── com
│ └── test
│ └── App.java
└── target
└── classes
└── com
└── test
└── App.class
-
它是什么
- Maven 规定了一套标准目录结构。
src/main/java放正式 Java 源代码;target放 Maven 编译、打包后生成的内容。
-
有什么作用
- 大家都按同一套规则放代码,Maven 就知道去哪里找源码、去哪里输出结果。
-
它的原理
- 执行
mvn compile时,Maven 会从src/main/java找.java文件; - 编译后生成
.class文件,放到target/classes。
- 执行
-
容易混淆的点
src/main/java是自己写的源码;target/classes是编译后的字节码;- 不要手动修改
target里的内容,因为它是 Maven 自动生成的。
3. pom.xml
-
它是什么
pom.xml是 Maven 项目的核心配置文件。- POM 的意思是 Project Object Model,即"项目对象模型"。
-
有什么作用
- 描述项目基本信息;
- 配置项目依赖;
- 配置插件;
- 设置 Java 编译版本;
- 控制项目如何构建。
-
它的原理
- Maven 执行命令时,会先读取
pom.xml; - 然后根据里面的配置去下载依赖、调用插件、执行生命周期阶段。
- Maven 执行命令时,会先读取
-
容易混淆的点
pom.xml是 XML 配置文件,不是 Java 文件;- 标签要写准确,依赖坐标不能多空格或写错;
- 修改
pom.xml后,IDE 里通常要重新加载 Maven。
4. Maven 坐标
Maven 坐标主要由三个标签组成:
xml
<groupId>com.test</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
-
它是什么
- Maven 坐标用来唯一定位一个项目或依赖。
-
有什么作用
- Maven 下载依赖时,就是根据坐标去仓库中寻找对应 jar 包;
- 其他项目引用你的项目时,也需要写你的坐标。
-
它的原理
groupId表示组织或包名体系;artifactId表示项目名或模块名;version表示版本号。
-
结合 demo 项目
- 你的
demo项目坐标是:
- 你的
text
com.test:demo:1.0-SNAPSHOT
- 容易混淆的点
groupId不是随便写的名字,一般类似包名;artifactId通常是项目名;SNAPSHOT表示开发版、快照版,不是最终稳定版本。
5. 依赖配置
Maven 依赖写在 pom.xml 的 <dependencies> 中:
xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
-
它是什么
- 依赖就是项目需要用到的第三方 jar 包。
-
有什么作用
- 比如想用 JUnit 测试框架,就在
pom.xml中加入 JUnit 依赖; - Maven 会自动帮我们下载并管理这个 jar 包。
- 比如想用 JUnit 测试框架,就在
-
它的原理
- Maven 根据
groupId、artifactId、version去本地仓库或远程仓库查找依赖; - 本地没有,就联网从远程仓库下载;
- 下载后放入本地 Maven 仓库。
- Maven 根据
-
容易混淆的点
<dependencies>是依赖列表,是外层容器;<dependency>是一个具体依赖;- 一个
<dependencies>里可以有多个<dependency>。
6. 依赖范围 scope
demo 项目中的 JUnit 依赖有:
xml
<scope>test</scope>
-
它是什么
scope表示依赖的使用范围。
-
有什么作用
- 控制这个依赖在什么阶段可用。
-
它的原理
test表示这个依赖只在测试阶段使用;- 主程序运行时不依赖它;
- 打正式包时一般不会把它当成运行依赖。
-
容易混淆的点
- JUnit 是测试框架,不是主程序必须依赖的东西;
scope=test说明它主要给src/test/java下的测试代码用。
7. Maven 生命周期
常见命令:
bash
mvn clean
mvn compile
mvn test
mvn package
mvn install
-
它是什么
- 生命周期就是 Maven 对项目构建过程的一套标准流程。
-
有什么作用
- 让所有 Maven 项目都能按统一步骤进行清理、编译、测试、打包、安装。
-
它的原理
- Maven 生命周期由多个阶段组成;
- 执行后面的阶段,会自动执行前面的阶段。
-
容易混淆的点
mvn package不只是打包,它会先编译、测试,再打包;mvn install不只是安装,它会先完成编译、测试、打包。
三、重难点
1. pom.xml 是 Maven 项目的核心
-
结论
- Maven 项目最核心的文件是
pom.xml。
- Maven 项目最核心的文件是
-
原因
- Maven 所有重要信息都从
pom.xml中读取,包括项目坐标、依赖、插件、编译版本等。
- Maven 所有重要信息都从
-
比喻
pom.xml像项目的"说明书"和"购物清单"。Maven 先看说明书,再决定怎么构建项目、需要买哪些 jar 包。
2. Maven 坐标必须精确
-
结论
groupId、artifactId、version要写准确,不能随便多空格。
-
原因
- Maven 是靠坐标去仓库中找依赖的;坐标写错,就找不到对应 jar 包。
-
例子
- 你的
demo项目中 JUnit 依赖如果写成:
- 你的
xml
<groupId>junit </groupId>
junit后面多了空格,可能导致 Maven 找不到依赖。更规范的写法是:
xml
<groupId>junit</groupId>
3. dependencies 和 dependency 不一样
-
结论
<dependencies>是所有依赖的外层容器;<dependency>是一个具体依赖。
-
原因
- 一个项目通常有很多依赖,所以需要一个总标签把它们包起来。
-
比喻
<dependencies>像购物车;- 每一个
<dependency>像购物车里的一件商品。
4. src/main/java 和 target/classes 不能混
-
结论
src/main/java放源码,target/classes放编译结果。
-
原因
- Maven 编译时,会把
.java文件变成.class文件。
- Maven 编译时,会把
-
例子
- 编译前:
text
src/main/java/com/test/App.java
- 编译后:
text
target/classes/com/test/App.class
5. package 和 install 的区别
-
结论
package是打包到当前项目的target目录;install是安装到本地 Maven 仓库。
-
原因
package只是给当前项目生成 jar;install是为了让其他 Maven 项目也能引用这个 jar。
-
比喻
package:把饭做好放在自己桌上;install:把饭放进公共冰箱,别的项目也能拿。
6. 执行后面的生命周期阶段,会自动执行前面的阶段
-
结论
- 执行
mvn package时,会先编译、测试,再打包。
- 执行
-
原因
- Maven 生命周期是有顺序的,后面的阶段依赖前面的阶段结果。
-
例子
- 执行:
bash
mvn package
- 大致流程是:
text
compile -> test -> package
- 执行:
bash
mvn install
- 大致流程是:
text
compile -> test -> package -> install
四、代码理解
1. demo 项目的 pom.xml 核心配置
xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>demo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>11</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
关键理解:
groupId + artifactId + version:组成 Maven 坐标;packaging:表示打包方式,这里是jar;maven.compiler.release:表示按 Java 11 编译;dependencies:依赖列表;dependency:一个具体依赖;scope=test:JUnit 只在测试阶段使用。
2. demo 项目的 Java 主类
java
package com.test;
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
关键理解:
package com.test;对应目录com/test;App.java放在src/main/java/com/test下;- 执行
mvn compile后,会生成target/classes/com/test/App.class; .java是源代码,.class是 JVM 能执行的字节码文件。
3. 依赖排除写法
如果引入某个依赖时,它又自动带来了一个不想要的传递依赖,可以使用 <exclusions> 排除。
xml
<dependency>
<groupId>某个依赖的groupId</groupId>
<artifactId>某个依赖的artifactId</artifactId>
<version>版本号</version>
<exclusions>
<exclusion>
<groupId>要排除的groupId</groupId>
<artifactId>要排除的artifactId</artifactId>
</exclusion>
</exclusions>
</dependency>
语法规则:
<exclusions>是排除依赖列表;<exclusion>是一个具体要排除的依赖;- 排除时通常只写
groupId和artifactId,不用写version。
五、易错点
-
把
pom.xml当成 Java 代码pom.xml是 Maven 配置文件,不是 Java 源码。
-
依赖坐标写错
groupId、artifactId、version必须准确;- 标签内容中不要多空格,比如
junit就不规范。
-
修改依赖后忘记重新加载 Maven
- 修改
pom.xml后,IDE 可能还没识别新配置; - 要点击 Maven 重新加载,或者让 Maven 重新导入依赖。
- 修改
-
分不清
package和installpackage只生成 jar 到当前项目的target;install会把 jar 放到本地 Maven 仓库。
-
手动修改
target目录target是构建结果目录;- 执行
mvn clean后可能会被删除; - 真正应该修改的是
src/main/java中的源码。
-
以为执行
mvn package只会打包- 实际上 Maven 会先编译和测试,测试通过后才打包。
六、记忆口诀 / 通俗比喻
1. Maven 是项目管家
管结构、管依赖、管编译、管打包。
2. pom.xml 是说明书
Maven 先看
pom.xml,再决定怎么干活。
3. Maven 坐标三件套
组织名
groupId,项目名artifactId,版本号version。
4. 依赖配置像购物
<dependencies>是购物车,<dependency>是商品。
5. 生命周期像做饭
clean洗锅,compile备菜,test尝味,package装盒,install放进公共冰箱。
七、应用
在实际开发中,Maven 最常见的用途就是管理项目依赖和统一构建流程。比如开发一个 Java 项目时,如果需要使用 JUnit 做测试,不需要自己去网上下载 jar 包,只要在 pom.xml 中写好 JUnit 的 Maven 坐标,Maven 就会自动帮我们下载。写完代码后,可以执行 mvn compile 检查代码能不能编译,执行 mvn test 跑测试,执行 mvn package 生成 jar 包。如果这个 jar 包还要给其他项目使用,就执行 mvn install 安装到本地 Maven 仓库。这样多个 Java 项目之间就可以通过坐标互相引用,项目管理会清晰很多。
八、最终总结
Maven 是 Java 项目的构建和依赖管理工具,核心配置文件是 pom.xml。Maven 坐标由 groupId、artifactId、version 组成,用来唯一定位项目或依赖。依赖统一写在 <dependencies> 中,每一个具体依赖用 <dependency> 表示。src/main/java 放源码,target 放 Maven 生成的编译和打包结果。常用生命周期命令中,clean 清理,compile 编译,test 测试,package 打包,install 安装到本地仓库。