【maven01】依赖管理的工具 - 教程

news/2025/9/19 9:14:37/文章来源:https://www.cnblogs.com/yfceshi/p/19100101

一、Maven 是什么?

Maven 是一个项目管理和构建自动化器具 Gradle 和 Ant)。就是。它最初起源于 Apache 工程,现在已经成为 Java 世界中最主流、最通用的构建工具之一(另外两个主流

它的核心思想是“约定优于配置”。这意味着 Maven 定义了一套标准的项目结构、构建生命周期和依赖管理方式。开发者只要遵循这个约定,就可以用非常简单的命令完成复杂的构建过程,而无需编写大量的配置脚本。

二、为什么需要 Maven?(它解决了什么问题)

在没有 Maven 或类似工具的时代,开发一个 Java 项目会遇到很多麻烦:

  1. 依赖管理困难:项目需要很多第三方 JAR 包(如 JUnit、Spring、Hibernate 等)。你需要手动去官网下载,并添加到项目的 lib 目录中。更头疼的是,这些 JAR 包本身可能还依赖其他的 JAR 包(即“传递性依赖”),你需要把它们都找齐,非常容易出错,且版本冲突频发。

  2. 构建过程繁琐:编译、测试、打包、部署等步骤应该手动执行一系列命令,或者编写艰难的 Ant 脚本,过程繁琐且不易统一。

  3. 项目结构不统一:每个人的任务目录结构都可能不一样,导致新人上手成本高,项目难以维护。

Maven 完美地解决了以上所有问题。

统一项目结构:提供标准、统一的项目结构

Maven 的标准项目构建流程可能概括为:

清理(clean) -> 验证(validate) -> 编译(compile) -> 测试(test) -> 打包(package) -> 检查(verify) -> 安装(install) -> 部署(deploy)

生命周期
Maven对工程构建的生命周期划分为3套(相互独立):
clean:清理工作。
default:核心工作。如:编译、测试、打包、安装、部署等。
site:生成报告、发布站点等。

我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,主
要关注以下几个:
• clean:移除上一次构建生成的材料
• compile:编译项目源代码
• test:采用合适的单元测试框架运行测试(junit)
• package:将编译后的资料打包,如:jarwar
• install:安装方案到本地仓库Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际工作。Maven的设计中,实际任务(如源代码编译)都交由插件来完成

依赖管理

Maven 的依赖管理基于以下几个核心机制协同工作:

1. 坐标(Coordinates):唯一标识

Maven 启用坐标来唯一标识一个构件(可能是项目生成的,也可以是第三方库)。坐标就像一件商品的条形码,由三个基本元素组成:

  • groupId: 定义项目所属的组织或公司(通常是域名反写,例如 org.apache.maven, org.springframework)。

  • artifactId: 定义项目的唯一模块ID(通常是项目名,例如 spring-core, junit)。

  • version: 项目的版本号(例如 5.3.8, 4.13.2)。

2. 仓库(Repository):存储与获取
  • 仓库是存放所有 Maven 构件(JAR 包、插件等)的地方,分为两类:

  • 本地仓库(Local Repository)

    • 在你个人电脑上的一个目录(默认是 用户目录/.m2/repository)。

    • 当你第一次引入某个依赖时,Maven 会从远程仓库下载它并存储在本地仓库中。

    • 下次再使用相同依赖时,Maven 会直接应用本地仓库的副本,无需重复下载,极大提高了构建速度。

  • 远程仓库(Remote Repository)

    • 中央仓库(Central Repository):Maven 社区维护的默认全球仓库,涵盖了绝大多数流行的开源库。无需任何特殊配备即可使用。

    • 私服(Private Repository):很多公司在内网搭建的私有 Maven 仓库(使用NexusArtifactory)。

      • 目的:作为中央仓库的代理和缓存,加速内网构建速度;部署公司内部开发的私有构件;控制外部依赖的访问。

3. 传递性依赖(Transitive Dependencies):自动处理

Maven 依赖管理中最强大的特性。就是这你只需要声明你直接使用的库(例如 Spring),Maven 会自动引入这个库所依赖的所有其他库(传递性依赖),以及这些库的依赖,直到整个依赖树完成。

示例
假设你的项目直接依赖了 A.jar

  • A.jar 本身又依赖于 B.jar

  • B.jar 本身又依赖于 C.jar

在 Maven 项目中,你只需要pom.xml 中声明对 A.jar 的依赖。Maven 会自动将 A, B, C 三个 JAR 包都加入到你的项目构建路径中。

关于依赖的其他内容

1. 依赖范围(Scope)

scope 用来控制依赖在哪个阶段有效,它决定了依赖是否会被打包到最终的构件中。这是非常重要且常用的配置。

Scope含义示例是否打入最终包?
compile默认值。在所有阶段都高效,包括编译、测试、运行。Spring Core
test只对测试代码高效。用于编译和运行测试,主代码不能用JUnit
provided表示该依赖在运行时将由 JDK 或容器(如 Tomcat)提供Servlet API
runtime测试和运行时需要,但编译时不需要JDBC 驱动
2. 排除依赖(Exclusions)

传递性依赖尽管方便,但有时也会带来困难,比如引入了有版本冲突或者不需要的传递性依赖。

这时可以使用 <exclusions> 标签来排除指定的传递性依赖

总结

Maven 的依赖管理机制通过:

  1. 坐标精准定位构件。

  2. 仓库统一存储和分发。

  3. 传递性依赖自动处理复杂的依赖关系。

  4. 依赖范围精细控制依赖的使用阶段和打包行为。

它将开发者从手动管理 JAR 包的繁琐、易错的工作中彻底解放出来,只需要一份声明式的 pom.xml 配置清单,即可实现高度自动化、可靠的依赖管理。这是现代Java开发不可或缺的基石。

这篇文章也是后端在应用层层面的开头,以后我们会见到spring全家桶,springcloud以及最新的ai大模型应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

长园智能装备遇上利驰SuperHarness-3D,实现充电桩线束设计效率与精度双提升!

利驰数字线束软件,赋能长园智能装备充电桩线束智造。设计案例:​感谢南瑞、盛弘、长园等众多充电桩龙头企业,选择利驰数字线束[抱拳][抱拳][抱拳]

学习笔记:操作分块 / 根号重构

感谢校内模拟赛给我强行灌输了这个东西。。。 概述 操作分块 / 根号重构,又名时间轴分块,可以解决需要多次修改和查询的问题,常常难以直接维护。 借鉴序列分块的思想,我们设定一个阈值 \(B\),将连续 \(B\) 次操作…

url测试脚本2

!/bin/sh . /etc/init.d/functions 待检测的 URL 列表 array=( "http://blog.oldboyedu.com" "http://blog.etiantian.org" "http://oldboy.blog.51cto.com" "http://10.0.0.7&quo…

运动控制教学——5分钟学会机器人运动学! - 实践

运动控制教学——5分钟学会机器人运动学! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

url测试脚本3

!/bin/sh . /etc/init.d/functions 待检测的 URL 列表 array=( "http://mail.163.com" "http://mail.sina.com/" ) 等待效果,输出进度 wait_for_start() { echo -n "Start Curl_check"…

深入解析:linux基本知识

深入解析:linux基本知识pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

解决方案架构师是做什么

解决方案架构师 面试题 客户是怎么管理的 渠道变革变换的是哪些内容。变的是什么? 分层分级是怎么设计,价格体系是怎么制定的 marking 是怎么做的? CAP模型,是怎么管理的, 营销活动和销售是如何结合的,IT解决方案…

鸿蒙应用开发从入门到实战(九):ArkTS渲染控制

ArkTS拓展了TypeScript,可以结合ArkUI进行渲染控制,是的界面设计具有可编程性。本文简要描述鸿蒙应用开发中的条件渲染和循环渲染。大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实…

C# 2025年6-9月TIOBE排名增长及未来展望

根据 TIOBE 编程语言排行榜 2025 年 6 月至 9 月的公开数据,C# 的排名和市场份额变化如下(综合多个月份数据整理):一、 C# 在 2025 年 TIOBE 排行榜的连续增长趋势2025 年 6 月排名:第 5 位市场份额:4.69%2025 年…

一个基于 .NET 开源、简易、轻量级的进销存管理系统

前言 最近有小伙伴在后台留言问:.NET 有值得推荐学习的进销存管理系统吗?今天大姚给大家推荐一个基于 .NET 开源、简易、轻量级的进销存管理系统:JxcLite。 项目介绍 JxcLite 是一个基于 Known 框架开发(基于 .NET…

Java 接口详解

Java 接口详解接口(Interface)是 Java 中实现抽象、定义规范、支持多态的核心机制,也是面向对象编程(OOP)中 “封装、继承、多态” 三大特性的重要载体。它不仅是代码层面的语法结构,更体现了 “面向接口编程” …

飞算 JavaAI 启用体验全解析

飞算 JavaAI 启用体验全解析2025-09-19 09:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

采用tree命令导出文件夹/文件的目录树(linux)

采用tree命令导出文件夹/文件的目录树(linux)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

MySQL 字符集详解

MySQL 字符集详解在 MySQL 数据库中,字符集(Character Set)是决定数据如何存储、传输和显示的核心组件,直接影响数据一致性(如避免乱码)、查询性能和多语言支持能力。本文将从字符集的基础概念出发,深入讲解 My…

The 2024 ICPC Asia East Continent Online Contest (I) 4/12 A/F/G/M

M. Find the Easiest Problem 签到题,直接模拟即可点击查看代码 #include<bits/stdc++.h> #define int long long using namespace std; using pii=pair<int,int>; using ll = long long; using ull = un…

Python上课

Python上课题目 杨辉三角 99 乘法表

Yapi接口文档本地安装

Yapi接口文档本地安装t

深入解析 JVM 类加载机制:从字节码到运行时对象

一、概述:为什么需要类加载? Java 语言的核心特性之一是"一次编写,到处运行",这背后的关键在于 Java 虚拟机(JVM)和其类加载机制。当我们编写好 Java 代码并将其编译为 .class 字节码文件后,这些静态…

博弈论学习(第二天)

博弈的基本理性假设: 一般来说,对于研究博弈问题,需要假设参与者具有完美理性,这分三方面,第一个就是参与者的偏好要有一定性,比如对风险的偏好,不能说一个参与者做第一个决策时属于风险接受型,而做第二个决策…

PHP 和 Elasticsearch:给你的应用加个强力搜索引擎

PHP 和 Elasticsearch:给你的应用加个强力搜索引擎 现在做 Web 应用,搜索功能基本是标配。不管你做电商、CMS 还是社交应用,用户都希望搜索又快又准。如果你用 PHP 开发,肯定遇到过数据库搜索的瓶颈——数据一多就…