Java小白-管理项目工具Maven(3)Ma
一、pom.xml文件
pom.xml 文件是 Maven(Apache Maven)项目的核心配置文件,它定义了项目的构建、依赖管理和项目元数据等信息。Maven 是一个流行的 Java 项目管理和构建自动化工具,而 pom.xml 是 Maven 项目中不可或缺的一部分。
pom.xml 文件中定义了项目所需的依赖库。Maven 会根据这些依赖配置自动下载并管理这些依赖库。依赖管理是 Maven 的核心功能之一,它使得开发者能够轻松地管理项目所需的外部库,而无需手动下载和配置。
二、坐标
1、Maven 坐标啥意思,能干啥
它用于唯一标识一个 Maven 项目或依赖。Maven 坐标由以下三个主要部分组成:groupId、artifactId 和 version。这三个部分共同定义了一个 Maven 项目的唯一身份。
Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器
2、Maven 坐标的三个主要部分是啥
-
groupId-
作用:定义项目的组 ID,通常是一个反向域名,用于区分不同的项目或组织。
-
示例:
com.example。这表示项目属于com.example这个组织或公司。 -
重要性:
groupId是项目所属组织的唯一标识,用于避免不同组织之间的项目名称冲突。
-
-
artifactId-
作用:定义项目的唯一标识符,通常是一个项目名称。
-
示例:
example-project。这表示项目名称为example-project。 -
重要性:
artifactId是项目在所属组织中的唯一标识,用于区分同一组织下的不同项目。
-
-
version-
作用:定义项目的版本号,用于区分不同版本的项目。
-
示例:
1.0.0。这表示项目当前的版本是1.0.0。 -
重要性:
version是项目版本的唯一标识,用于管理项目的不同版本,确保依赖的正确性。
-
三、依赖
1、依赖的意义
- 代码复用:就好像我们组装车时都需要轮子,但是我们每次从橡胶、螺丝开始也太麻烦了,为了避免重复造轮子,提高开发效率,依赖允许开发者复用已有的代码库拿来使用
- 功能扩展:通过引入依赖,项目可以扩展新的功能,如数据库访问、Web 开发、安全性等。
- 版本管理:依赖管理工具可以帮助开发者管理不同版本之间的兼容性问题,确保项目稳定运行。
- 构建自动化:自动化构建工具可以自动下载和配置依赖,简化了构建过程。
2、依赖的使用
在 Maven 中,依赖通常在 pom.xml 文件的 <dependencies> 部分进行配置。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.0</version></dependency>
</dependencies>
3、第三方依赖的查找方法
-
Maven 中央仓库:
-
Maven 中央仓库是最大的公共 Maven 仓库,包含了大量的开源项目和库。
-
可以通过访问 Maven Central 搜索依赖。
-
-
项目文档:
-
许多开源项目在其文档中会列出所需的依赖,可以直接从文档中获取依赖信息。
-
-
IDE 插件:
-
许多集成开发环境(IDE)如 IntelliJ IDEA、Eclipse 等,都提供了 Maven 插件,可以直接在 IDE 中搜索和添加依赖。
-
-
社区和论坛:
-
在 Stack Overflow、GitHub 等社区和论坛中,可以找到关于特定依赖的讨论和推荐。
-
-
依赖管理工具:
-
一些工具如 Spring Initializr 可以帮助快速生成包含所需依赖的 Spring Boot 项目。
-
-
版本管理工具:
-
使用如 Semantic Versioning 等版本管理工具,可以帮助选择合适的依赖版本。
-
四、依赖范围
| 依赖范围 | 描述 | 是否传递 | 是否包含在最终构建中 | 典型用途 |
|---|---|---|---|---|
compile | 默认范围,编译、测试和运行时都需要 | 是 | 是 | 项目的主要依赖,如 Spring Boot 启动器 |
provided | 编译和测试时需要,运行时由环境提供 | 是 | × | 需要由 JRE 或者应用服务器提供的依赖,如 Servlet API |
runtime | 编译时不需要,测试和运行时需要 | 是 | 是 | 运行时需要但编译时不需要的依赖,如数据库驱动 |
test | 仅在测试时需要 | × | × | 测试框架和测试相关的库,如 JUnit |
system | 编译、测试和运行时都需要,需要手动指定本地路径 | 是 | 是 | 系统路径下的库,不推荐使用,因为它降低了项目的可移植性 |
import | 导入一个 POM 文件作为当前 POM 的一部分 | × | × | 用于导入一个外部的 POM 文件,如 Maven 插件的 POM |
-
是否传递:表示该依赖范围是否会传递给依赖于当前项目的其他项目。例如,如果一个
compile范围的依赖引入了一个runtime范围的依赖,那么这个runtime范围的依赖也会被打包到最终的 JAR 文件中。 -
是否包含在最终构建中:表示该依赖范围是否包含在最终的构建产物中,如 JAR 文件或 WAR 文件。
-
典型用途:表示该依赖范围的典型使用场景。
-
compile
-
默认的依赖范围。
-
编译、测试和运行时都需要的依赖。
-
会被打包到最终的 JAR 文件中。
-
-
provided
-
编译和测试时需要,但运行时由容器或运行环境提供。
-
不会被打包到最终的 JAR 文件中。
-
适用于如 Servlet API 这样的依赖,它们在运行时由 Web 容器提供。
-
-
runtime
-
编译时不需要,但测试和运行时需要的依赖。
-
不会被打包到最终的 JAR 文件中。
-
适用于如数据库驱动这样的依赖,它们在运行时需要,但在编译时不需要。
-
-
test
-
仅在测试时需要的依赖。
-
不会被打包到最终的 JAR 文件中。
-
适用于如 JUnit 这样的测试框架。
-
-
system
-
编译、测试和运行时都需要的依赖。
-
需要手动指定依赖的本地路径。
-
不推荐使用,因为它使得项目依赖于本地文件,降低了可移植性。
-
五、依赖传递和可选依赖
在Spring Boot项目中,依赖传递是Maven和Gradle等构建工具的一个重要特性。当一个项目依赖某个库时,这个库所依赖的其他库(传递依赖)也会自动被包含进来。
依赖传递的特点
- 自动解析:构建工具会自动解析并下载所有传递依赖
- 依赖树:可以通过
mvn dependency:tree命令查看完整的依赖关系树 - 版本仲裁:当多个依赖对同一库有不同版本要求时,构建工具会选择一个版本(通常是最新版本)
Spring Boot中的依赖管理
Spring Boot通过spring-boot-starter-parent或spring-boot-dependencies提供了依赖管理功能:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version>
</parent>
这确保了所有Spring Boot相关依赖的版本兼容性。
可选依赖(Optional Dependencies)
可选依赖是一种标记机制,表示某个依赖不是项目运行所必需的。
可选依赖的特点
- 不自动传递:标记为optional的依赖不会被自动传递给依赖当前项目的其他项目
- 显式声明:使用方需要显式声明这些依赖
- 适用场景:适用于只在特定环境下需要的依赖
在Maven中声明可选依赖
<dependency><groupId>com.example</groupId><artifactId>optional-library</artifactId><version>1.0.0</version><optional>true</optional>
</dependency>
实际应用场景
-
数据库驱动:项目可能支持多种数据库,但用户只需要其中一种
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><optional>true</optional> </dependency> <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><optional>true</optional> </dependency> -
特定功能模块:某些功能只在特定环境下需要
-
测试依赖:测试相关的依赖通常不应传递到生产环境
依赖冲突解决
当出现依赖冲突时,可以:
-
使用
<exclusions>排除特定传递依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion></exclusions> </dependency> -
显式声明所需版本,覆盖传递依赖的版本
-
使用Maven的
dependencyManagement统一管理版本
相关文章:
Java小白-管理项目工具Maven(3)Ma
一、pom.xml文件 pom.xml 文件是 Maven(Apache Maven)项目的核心配置文件,它定义了项目的构建、依赖管理和项目元数据等信息。Maven 是一个流行的 Java 项目管理和构建自动化工具,而 pom.xml 是 Maven 项目中不可或缺的一部分。 …...
C++中的多态和模板
#include <iostream> #include <cstdlib> #include <ctime> #include <string>using namespace std;// 武器基类 class Weapon { public:virtual ~Weapon() {}virtual string getName() const 0; // 获取武器名称virtual int getAtk() const 0; …...
Java 类型转换和泛型原理(JVM 层面)
一、类型转换 概念解释: 编译类型:在编译时确定,保存在虚拟机栈的栈帧中的局部变量表中; 运行类型:在运行时确定,由保存在局部变量表中变量指向的堆中对象实例的类型决定(存储在对象头中&…...
Wireshark 安装保姆教程(图文详解)
一、Wireshark 简介 Wireshark是使用最广泛的一款开源抓包软件,常用来检测网络问题、攻击溯源、或者分析底层通信机制。它使用WinPCAP作为接口,直接与网卡进行数据报文交换,它支持在 Windows、Mac OS、Linux 等多种主流操作系统上运行 &…...
下载安装Node.js及其他环境
提示:从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm(我需要安装)安装脚手架安装依赖安装淘宝镜像(注意会更新)cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…...
机器视觉3D中激光偏镜的优点
机器视觉的3D应用中,激光偏镜(如偏振片、波片、偏振分束器等)通过其独特的偏振控制能力,显著提升了系统的测量精度、抗干扰能力和适应性。以下是其核心优点: 1. 提升3D成像精度 抑制环境光干扰:偏振片可滤除非偏振的环境杂光(如日光、室内照明),仅保留激光偏振信号,大…...
MyBatis Plus 在 ZKmall开源商城持久层的优化实践
ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台,其持久层通过 MyBatis Plus 实现了多项深度优化,涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结: 一、分库分表与插件集成优化 1. 分库分表策略 Sh…...
rust 同时处理多个异步任务,并在一个任务完成退出
use std::thread; use tokio::{sync::mpsc,time::{sleep, Duration}, };async fn check_for_one() {// 该函数会每秒打印一次 "write"loop {println!("write");sleep(Duration::from_secs(1)).await;} }async fn start_print_task() -> Result<(), (…...
使用注解开发springMVC
引言 在学习过第一个springMVC项目建造过后,让我们直接进入真实开发中所必需的注解开发, 是何等的简洁高效!! 注:由于Maven可能存在资源过滤的问题,在maven依赖中加入 <build><resources>&l…...
深入解析 Java 8 Function 接口:函数式编程的核心工具
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Java 8 引入的 java.util.function.Function 接口是函数式编程范式的核心组件之一,本文将全面解析其使用方法,并通过丰富的代码示例演…...
【Axure元件分享】时间范围选择器
时间范围选择器下拉选择开始时间和结束时间,实现效果如下。 源文件截图: 元件获取方式:...
【Linux操作系统——学习笔记三】Linux环境下多级目录构建与管理的命令行实践报告
1.在用户主目录下,使用以下方法新建目录,并显示详细执行过程: (1)使用绝对路径在当前目录下创建 new_dir目录 (2)使用相对路径、在当前目录创建dir1、dir2、dir3目录 (3)…...
Mysql 中的两阶段提交
MySQL 中的“两阶段提交”(Two-Phase Commit,2PC)是用于分布式事务中的一种协议,目的是保证在多个数据库节点之间操作的一致性。虽然 MySQL 自身并不是分布式数据库,但在 使用 InnoDB 引擎和 binlog 的情况下ÿ…...
Scade One - 将MBD技术从少数高安全领域向更广泛的安全嵌入式软件普及
Scade One是继Scade Suite version 6自2008年起发展近20年后的首次主要改进版本。在Scade One发布的同时,Scade团队发布了一系列介绍Scade One的博客。本篇Scade One - Democratizing model-based development是其中的一部分。在后面的内容中,将复述博客…...
C# 与 相机连接
一、通过组件连接相机 需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp 定义一个相机工具 CogAcqFifoTool mAcq null;将保存的相机工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);给窗口相机…...
JAVA学习小记之IO流04--转换流篇
转换流: 按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。 转换的原因是: 有的文件并非是按UTF-8编码,那么在读文件内容…...
SH 和 BASH 有什么不同 ?
当谈到 shell 脚本编写时,经常出现两个突出的 shell,Bourne shell (SH) 和 Bourne Again shell (Bash)。两者都是基于 unix 和 linux 的系统的组成部分,提供与操作系统交互的接口。本文旨在深入研究这两种 shell 之间的复杂差异,揭…...
linux专题3-----linux上链接远程mysql
要在 Ubuntu 上连接远程 MySQL 数据库,你可以使用 MySQL 客户端工具或者其他数据库管理工具,如 phpMyAdmin 或 MySQL Workbench。以下是使用 MySQL 命令行工具连接远程 MySQL 的步骤: 确保已安装 MySQL 客户端 首先,确保你的 Ub…...
Qt 音乐播放器项目
具体代码见:https://gitee.com/Suinnnnnn/MusicPlayer 文章目录 0. 预备1. 界面1.1 各部位长度1.2 ui文件1.3 窗口前置设置1.4 设置QSS 2. 自定义控件2.1 按钮2.2 推荐页面2.3 CommonPage2.4 滑杆 3. 音乐管理4. 歌词界面4.1 ui文件4.2 LrcPage.h文件 5. 音乐播放控…...
类似于langchain的开发框架有哪些?
类似于 LangChain 的开发框架主要用于构建基于大语言模型(LLM)的应用程序,提供链式调用、工具集成、记忆管理等功能。以下是一些类似的框架和工具: 1. LlamaIndex(原GPT Index) 特点:专注于文档…...
IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南
前言 Spring Boot 3.4.x作为当前最新稳定版本,全面支持Java 17与Jakarta EE 10规范。本文以Spring Boot 3.4.1和Redis 7.x为例,详解如何在IDEA中快速接入Redis,涵盖最新依赖配置、数据序列化优化、缓存注解及高…...
【mongodb】MongoDB的应用场景
目录 1.说明2.内容管理系统(CMS)2.1 场景描述2.2 MongoDB优势2.3 示例 3.实时分析与大数据3.1 场景描述3.2 MongoDB优势3.3 示例 4.移动应用后端4.1 场景描述4.2 MongoDB优势4.3 示例 5.游戏开发5.1 场景描述5.2 MongoDB优势5.3 示例 6.电子商务平台6.1 …...
.NET用C#在PDF文档中添加、删除和替换图片
在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一。通过C#在.NET平台实现图片的添加、替换和删除功能,不仅能显著提升PDF文档的视觉表现力与信息承载效率,更可满足数据动态更新、内容精准维护等复杂业…...
Linux文件操作命令详解
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在Linux操作系统中,文件操作命令是用户与系统交互的重要工具。掌握这些命令能够高效地管理文件和目录。本文将详细介绍常用的Linux文件操作命令,包括它们的用法、选项、具体示例及运行结果。 1. 查看文…...
anaconda安装使用+pytorch环境配置(cpu)+pycharm环境配置(详细教程)
一、anaconda下载 1.anaconda官网尝试下载: 官网网址:Anaconda | Built to Advance Open Source AI 1.进入官网 2.点击Products->Distribution,跳过注册进入下载页面 3.选择系统下载 2.清华镜像下载 1.网址:Index of /anac…...
c++STL入门
目录 什么是STL? vector容器 构造函数 赋值操作 vector容量和大小 vector存放内置数据类型 vector存放自定义数据类型 存放指针 vector容器嵌套容器 string容器 构造函数 赋值操作 字符串拼接 查找和替换 string字符串比较 string字符存取 string插…...
electron-update + nginx热更新
1.安装"electron-updater": “^6.6.2”, npm i electron-updater2.创建checkUpdate.js // 引入自动更新 const {autoUpdater} require(electron-updater); const { dialog } require(electron); // 自动更新检查 export function checkForUpdates() {// 检查新版…...
SpringMVC与SpringCloud的区别
SpringMVC与SpringCloud的核心区别 功能定位 • SpringMVC: 基于Spring框架的Web层开发模块,采用MVC(Model-View-Controller)模式,专注于处理HTTP请求、路由分发(如DispatcherServlet)和视图…...
【动态规划】P8638 [蓝桥杯 2016 省 A] 密码脱落
题解:P8638 [蓝桥杯 2016 省 A] 密码脱落 题目传送门:P8638 密码脱落 一、题目描述 考古学家发现了一些由 A、B、C、D 四种种子组成的密码串,这些串原本是回文串(前后对称),但由于部分种子脱落ÿ…...
PyTorch池化层详解:原理、实现与示例
池化层(Pooling Layer)是卷积神经网络中的重要组成部分,主要用于降低特征图的空间维度、减少计算量并增强模型的平移不变性。本文将通过PyTorch代码演示池化层的实现原理,并详细讲解最大池化、平均池化、填充(Padding&…...
