当前位置: 首页 > news >正文

初识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 使用 依赖路径长度 来决定:
谁在依赖树中路径更短(层级更浅),谁就胜出
路径长度 = 从根项目到该依赖的边数

你的项目 ├── 直接依赖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 中,在 内部使用 标签:

<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 规定了一套标准的目录布局,你不用再纠结“源代码放哪里、测试代码放哪里”:
项目根目录/├── 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 等),就停止查找,下载并缓存到本地仓库,后续构建直接使用本地缓存。

http://www.jsqmd.com/news/579139/

相关文章:

  • 2026年矿山煤矿电力电缆生产厂家推荐:中低压、低压、中压、变频等电缆厂家 - 品牌2026
  • OpenClaw+百川2-13B-4bits量化模型:个人周报自动化生成与整理方案
  • 阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案
  • OpenClaw飞书机器人配置:Qwen3.5-9B-AWQ-4bit对话触发全流程
  • Diablo Edit2实战解决方案:从存档修复到角色定制的完整指南
  • 2026年国内阻燃防火电缆推荐!阻燃防火电缆国内一线品牌精选 - 品牌2026
  • “title“: “从Java全栈开发视角看现代Web应用架构设计“,
  • 什么是Token?一文读懂Token是什么,影响你的使用成本!
  • TI SAR ADC模型(Matlab) 包含各类非理想因素,时钟偏差,增益偏差
  • Swift学习笔记13-可选链
  • 从手动挡到自动驾驶:Infoseek如何用工程思维重构媒体发布
  • OpenClaw镜像体验报告:千问3.5-35B-A3B-FP8多模态任务云端实测
  • 状态机中的人物状态
  • 50万行代码泄露后,开发者们凌晨4点冲进Rust:这次真的撕开了
  • OpenClaw备份与迁移:Qwen2.5-VL-7B配置快速转移指南
  • 2026年最吃香的IT岗!AI大模型应用开发,普通人如何逆袭百万年薪?
  • 工业冷水机控制程序西门子1200plc含压缩机,电子膨胀阀控制策略,饱和温度计算公式
  • PCB Layout设计核心要点与工程实践
  • 智能家庭教育:OpenClaw+Phi-3-vision-128k-instruct批改孩子手写作业
  • 如何评估 SEO 平台优化服务的效果
  • jfinal_cms-v5.1.0 白盒 nday CVE-2024-53477实验
  • OpenClaw内存优化指南:在8GB设备运行Qwen3.5-9B-AWQ-4bit
  • Claude Code 源码研究【第二弹】:智能体框架与大模型相互成就
  • 构建编译环境
  • 基于机器学习算法的亚马逊用户评论情感分析研究:深入探讨随机森林与决策树模型的应用及其实验评估
  • 为什么你的Protobuf解析比gRPC官方慢3.2倍?7个JVM参数+2个序列化策略的硬核调优清单
  • 零基础玩转OpenClaw:Qwen3.5-9B镜像10分钟体验报告
  • 怎么选购监控?
  • 代码分享】“基因集单通路的泛癌GSEA富集分析
  • AI 生码:RAG 落地量化实践与体系搭建