初识Maven

一,了解Maven

简单来说Maven是一个工具,核心作用是对Java项目的依赖管理与项目构建

1.什么是"项目"?(在软件开发中)

一个软件"项目",就是为了完成某个软件产品而组织起来的全部资源。

在 Java 世界里,一个项目通常包含:

  1. 源代码(你写的 .java 文件)
  2. 配置文件(如 application.properties)
  3. 测试代码(验证代码是否正常)
  4. 依赖的第三方库(别人写好的功能)
  5. 构建脚本(告诉工具如何编译、打包)
  6. 最终产物(一个 .jar 或 .war 文件)

可以把项目理解成 "一个房子的设计图纸 + 建筑材料 + 施工方案" 的集合,最终目标是建出一栋能用的房子(软件)

2.什么是"依赖"?

依赖就是你的项目要用到的 别人写好的代码(通常是打包成 .jar 的库)

为什么需要依赖?

你不需要重复造轮子。比如要做 HTTP 请求,可以直接用 Apache HttpClient;要操作数据库,可以用 MyBatis 或 Hibernate。

现代软件开发几乎不可能完全从零开始,依赖无处不在

依赖的"传递性"

假如你的项目依赖了 A,而 A 又依赖了 B 和 C,那么你的项目间接也依赖了 B 和 C。

如果没有工具管理,你需要手动下载 A、B、C 三个 jar 包,还要处理版本冲突(比如 A 需要 B 的 2.0 版,但另一个依赖需要 B 的 1.5 版)

由于传递性,依赖又会依赖更多库,Maven 会递归地全部下载,最终形成一个依赖树

a)解决依赖冲突,"最近优先"原则

假设你的项目:

直接依赖 库 X(版本 2.0)

直接依赖 库 Y

库 Y 传递依赖了 库 X(版本 1.0)

那么你的项目中同时出现了 X 的两个版本:2.0 和 1.0。但最终运行只能有一个版本的 X 的类被加载,Maven 必须决定保留哪一个

解决方案:最近优先

Maven 使用 依赖路径长度 来决定:

谁在依赖树中路径更短(层级更浅),谁就胜出

路径长度 = 从根项目到该依赖的边数

java 复制代码
你的项目
├── 直接依赖 X:2.0       (路径长度 1)
└── 直接依赖 Y           (路径长度 1)
    └── Y 依赖 X:1.0     (路径长度 2)

X:2.0 的路径长度为 1

X:1.0 的路径长度为 2

最近优先原则:选择路径更短的,即 X:2.0 胜出,X:1.0 被忽略(不会出现在最终依赖图中)。

如果两个版本的路径长度相同,Maven 会按照 声明顺序:在 pom.xml 中先声明的优先

b)依赖排除

当你通过传递依赖得到了一个不想要的版本,而 Maven 的"最近优先"原则没能选出你希望的版本时,你可以排除那个有问题的传递依赖,然后自己显式声明一个正确的版本

语法是在 pom.xml 中,在 内部使用 标签:

java 复制代码
<dependency>
    <groupId>com.example</groupId>
    <artifactId>library-a</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.example</groupId>
            <artifactId>unwanted-lib</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3.Maven作用的体现

  1. 对于项目的管理
    Maven 规定了一套标准的目录布局,你不用再纠结"源代码放哪里、测试代码放哪里":
java 复制代码
项目根目录/
├── pom.xml                ← 核心配置文件
├── src/
│   ├── main/
│   │   ├── java/          ← 所有 Java 源代码
│   │   └── resources/     ← 配置文件
│   └── test/
│       ├── java/          ← 单元测试代码
│       └── resources/     ← 测试专用配置
└── target/                ← 编译后的文件(自动生成)
  1. 对于依赖的管理
    依赖的管理十分复杂(依赖的传递与冲突手动解决十分麻烦)但使用Maven,你只需要在 pom.xml 里声明依赖的 坐标(groupId、artifactId、version),Maven 就会:
    a)从 中央仓库(或你配置的私有仓库)自动下载这个 jar 包;
    b)自动下载它的所有传递依赖;
    c)帮你 解决版本冲突(通过"最近优先"等规则选择合适版本)。
    d)你不再需要把 jar 包复制到项目的目录,也不再需要手动管理依赖关系

4)Maven仓库

Maven 仓库本质上是一个目录结构,按照特定的规则组织文件,可以通过pom文件或者settings文件等方式配置

每个构件(artifact)通过 坐标(groupId : artifactId : version) 唯一定位

Maven 官方将仓库分为 本地仓库 和 远程仓库 两大类。

  1. 本地仓库:位于开发者本机,缓存下载的构件。
  2. 远程仓库:位于网络上的其他位置,包括中央仓库、公司私有仓库(私服)、第三方镜像等

a)依赖查找顺序

Maven 查找依赖时,严格按照以下顺序依次尝试:

  1. 本地仓库(Local Repository)

  2. 远程仓库(Remote Repositories),按配置的声明顺序依次查找

    a)以买东西举例,先问你写在 pom.xml 里的商店(比如公司内部私服)

    b)再问你写在 settings.xml 里的商店(比如全局配置的镜像仓库)

    c)最后才去 默认的大超市(中央仓库))

  3. 中央仓库(Central Repository,默认地址 https://repo.maven.apache.org/maven2)

一旦在某个仓库中找到所需的构件(即 .pom 文件和对应的 .jar 等),就停止查找,下载并缓存到本地仓库,后续构建直接使用本地缓存。

相关推荐
csdn2015_2 小时前
HashSet 和 LinkedHashSet 区别
java·开发语言
一生了无挂2 小时前
springboot使用logback自定义日志
java·spring boot·logback
江不清丶2 小时前
生产实战:系统频繁Full GC,如何一步步定位与解决?
java·jvm
一 乐2 小时前
剧场管理系统|基于springboot + vue剧场管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·剧场管理系统
lKWO OMET2 小时前
Spring Boot中的404错误:原因、影响及处理策略
java·spring boot·后端
吃不胖爹2 小时前
宝塔部署前后端时,配置域名与ssl证书
java·jvm
umeelove352 小时前
SpringBoot【实用篇】- 测试
java·spring boot·后端
unDl IONA2 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
bitt TRES2 小时前
Spring Boot整合Redisson的两种方式
java·spring boot·后端