JavaWeb从0到1-DAY5-Maven

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 不是 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
    • 然后根据里面的配置去下载依赖、调用插件、执行生命周期阶段。
  • 容易混淆的点

    • 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 包。
  • 它的原理

    • Maven 根据 groupIdartifactIdversion 去本地仓库或远程仓库查找依赖;
    • 本地没有,就联网从远程仓库下载;
    • 下载后放入本地 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 所有重要信息都从 pom.xml 中读取,包括项目坐标、依赖、插件、编译版本等。
  • 比喻

    • pom.xml 像项目的"说明书"和"购物清单"。Maven 先看说明书,再决定怎么构建项目、需要买哪些 jar 包。

2. Maven 坐标必须精确

  • 结论

    • groupIdartifactIdversion 要写准确,不能随便多空格。
  • 原因

    • Maven 是靠坐标去仓库中找依赖的;坐标写错,就找不到对应 jar 包。
  • 例子

    • 你的 demo 项目中 JUnit 依赖如果写成:
xml 复制代码
<groupId>junit </groupId>
  • junit 后面多了空格,可能导致 Maven 找不到依赖。更规范的写法是:
xml 复制代码
<groupId>junit</groupId>

3. dependenciesdependency 不一样

  • 结论

    • <dependencies> 是所有依赖的外层容器;<dependency> 是一个具体依赖。
  • 原因

    • 一个项目通常有很多依赖,所以需要一个总标签把它们包起来。
  • 比喻

    • <dependencies> 像购物车;
    • 每一个 <dependency> 像购物车里的一件商品。

4. src/main/javatarget/classes 不能混

  • 结论

    • src/main/java 放源码,target/classes 放编译结果。
  • 原因

    • Maven 编译时,会把 .java 文件变成 .class 文件。
  • 例子

    • 编译前:
text 复制代码
src/main/java/com/test/App.java
  • 编译后:
text 复制代码
target/classes/com/test/App.class

5. packageinstall 的区别

  • 结论

    • 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> 是一个具体要排除的依赖;
  • 排除时通常只写 groupIdartifactId,不用写 version

五、易错点

  1. pom.xml 当成 Java 代码

    • pom.xml 是 Maven 配置文件,不是 Java 源码。
  2. 依赖坐标写错

    • groupIdartifactIdversion 必须准确;
    • 标签内容中不要多空格,比如 junit 就不规范。
  3. 修改依赖后忘记重新加载 Maven

    • 修改 pom.xml 后,IDE 可能还没识别新配置;
    • 要点击 Maven 重新加载,或者让 Maven 重新导入依赖。
  4. 分不清 packageinstall

    • package 只生成 jar 到当前项目的 target
    • install 会把 jar 放到本地 Maven 仓库。
  5. 手动修改 target 目录

    • target 是构建结果目录;
    • 执行 mvn clean 后可能会被删除;
    • 真正应该修改的是 src/main/java 中的源码。
  6. 以为执行 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 坐标由 groupIdartifactIdversion 组成,用来唯一定位项目或依赖。依赖统一写在 <dependencies> 中,每一个具体依赖用 <dependency> 表示。src/main/java 放源码,target 放 Maven 生成的编译和打包结果。常用生命周期命令中,clean 清理,compile 编译,test 测试,package 打包,install 安装到本地仓库。

相关推荐
2501_901006471 小时前
如何用SQL统计每组的平均值同时显示原行_OVER子句
jvm·数据库·python
dfdfadffa1 小时前
Python后端Flask如何实现短信验证码发送_调用云厂商API实现功能
jvm·数据库·python
m0_690825821 小时前
Redis如何验证主从心跳健康_理解主库发送PING与从库回复REPLCONF ACK机制
jvm·数据库·python
阿正呀1 小时前
C#怎么实现缓存功能 C#如何用MemoryCache和Redis实现数据缓存提升访问速度【架构】
jvm·数据库·python
m0_733565461 小时前
如何在MongoDB中实现按时间跨度的分片路由_时间序列范围分片与冷热节点架构
jvm·数据库·python
woxihuan1234561 小时前
SQL处理大规模分组聚合的内存限制_调整服务器配置
jvm·数据库·python
农业工作者1 小时前
IDEA解决springboot工程中Cannot resolve symbol ‘SpringApplication异常 maven解决
java·开发语言·maven
2401_833033621 小时前
如何用 http 模块创建一个基础的 Web 服务器处理请求
jvm·数据库·python
CLX05052 小时前
golang如何实现群聊功能_golang群聊功能实现策略.txt
jvm·数据库·python