Maven 依赖管理

Maven 依赖管理

Maven 是一个强大的工具,它简化了项目依赖的管理。

Maven 自动化了下载和包含必要库的过程,这对于构建 Java 应用程序至关重要。

本文将涵盖 Maven 依赖管理的核心方面,包括如何声明依赖、依赖范围、传递依赖、依赖管理、排除依赖和解决冲突。

我们还将提供一个完整的示例来说明这些概念。

目录
  1. 了解依赖
  2. 在 POM 中声明依赖
  3. 依赖范围
  4. 传递依赖
  5. 依赖管理
  6. 排除依赖
  7. 仓库
  8. 解决冲突
  9. 完整示例
  10. 结论

1. 了解依赖

在 Maven 中,依赖是指项目所需的外部库或模块。依赖在项目对象模型(POM)文件中指定。Maven 在构建过程中使用这些依赖,以确保所有必要的组件都可用。

2. 在 POM 中声明依赖

依赖在 POM 文件的 <dependencies> 部分声明。每个依赖项通过以下元素指定:

  • groupId:依赖所属的组或组织。
  • artifactId:依赖的唯一标识符。
  • version:要使用的依赖版本。
  • scope:依赖在构建过程中的作用范围。

示例:

<dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.3</version><scope>test</scope></dependency>
</dependencies>

3. 依赖范围

scope 元素定义了依赖的可见性。Maven 支持多种范围:

  • compile:默认范围,适用于所有类路径。
  • provided:编译时可用,但不会包含在最终的包中。
  • runtime:运行时可用,但编译时不可用。
  • test:仅在测试期间可用。
  • system:类似于 provided,但需要显式提供依赖。
  • import:仅在 dependencyManagement 部分可用,用于导入依赖 POM。

示例:

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

4. 传递依赖

Maven 不仅解析直接依赖,还解析这些依赖的依赖,即传递依赖。这确保了所有必需的库都被包含在构建中。

示例:
如果 junit 依赖于 hamcrest-core,Maven 会自动将这些传递依赖包含在项目中。

5. 依赖管理

<dependencyManagement> 部分用于定义一组可以被子项目继承的依赖。它提供了一个集中管理依赖版本的地方。

示例:

<dependencyManagement><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.2</version></dependency></dependencies>
</dependencyManagement>

6. 排除依赖

有时,您可能需要排除特定的传递依赖。这可以通过 <exclusions> 元素实现。

示例:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.32.Final</version><exclusions><exclusion><groupId>org.jboss.logging</groupId><artifactId>jboss-logging</artifactId></exclusion></exclusions>
</dependency>

7. 仓库

Maven 使用仓库来下载依赖。有两种类型的仓库:

  • 本地仓库:位于开发者的机器上,Maven 将下载的依赖缓存于此。
  • 远程仓库:公共仓库如 Maven Central 或公司自定义仓库,其中托管依赖。

配置仓库:
仓库可以在 POM 文件或 Maven 设置文件(settings.xml)中配置。

示例:

<repositories><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository>
</repositories>

8. 解决冲突

当多个版本的同一依赖被包含时,Maven 使用最近定义策略来解决冲突。最近的 POM 文件(最接近项目的 POM 文件)中指定的版本优先。

使用依赖调解:
为了显式控制依赖的版本,可以使用 <dependencyManagement> 部分。

示例:

<dependencyManagement><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency></dependencies>
</dependencyManagement>

9. 完整示例

让我们通过一个完整的示例来整合所有内容,这是一个简单的 Java 项目。

项目结构:

my-app
│   pom.xml
└───src└───main└───java└───com└───example└───app│   App.java
└───src└───test└───java└───com└───example└───app│   AppTest.java

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>My Maven App</name><description>Example Maven Project</description><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.2</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.3</version><scope>test</scope></dependency></dependencies><repositories><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository></repositories><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source><target>11</target></configuration></plugin></plugins></build>
</project>

App.java:

package com.example.app;import com.fasterxml.jackson.databind.ObjectMapper;public class App {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();System.out.println("Hello, Maven!");}
}

AppTest.java:

package com.example.app;import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertTrue;public class AppTest {@Testpublic void testApp() {assertTrue(true);}
}

10. 结论

Maven 通过自动化下载和包含必要库的过程,简化了依赖管理。理解如何声明依赖、管理范围、处理传递依赖和解决冲突是高效项目管理的关键。

提供的示例展示了如何使用 Maven 设置一个基本的 Java 项目,确保所有必要的组件都可用于构建和测试应用程序。

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

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

相关文章

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…

transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景

随着大模型的广泛应用&#xff0c;越来越多的开发者希望在前端直接运行机器学习模型&#xff0c;从而减少对后端的依赖&#xff0c;并提升用户体验。Transformer.js 是一个专为前端环境设计的框架&#xff0c;它支持运行基于 Transformer 架构的深度学习模型&#xff0c;尤其是…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么&#xff1f; HTTP 是超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些&#xff1f; …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

力扣 LeetCode 235. 二叉搜索树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归 递归法没有中的逻辑 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return recur(root, p, q);}public TreeNode recur(TreeNode root, TreeNode p, TreeNode q) {if (root…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限&#xff0c;并且插入和删除操作效率低的问题 1.2概念 链表&#xff1a;链式存储的线性表&#xff0c;使用随机物理内存存储逻辑上连续的数据 链表的组成&#xff1a;由一个个结点组成 结点&#xff1a;由数据域和链接域组成&a…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Flink Lookup Join(维表 Join)

Lookup Join 定义&#xff08;支持 Batch\Streaming&#xff09; Lookup Join 其实就是维表 Join&#xff0c;比如拿离线数仓来说&#xff0c;常常会有用户画像&#xff0c;设备画像等数据&#xff0c;而对应到实时数仓场景中&#xff0c;这种实时获取外部缓存的 Join 就叫做维…

LeetCode 101题集(随时更新)

题集来源&#xff1a;GitHub - changgyhub/leetcode_101: LeetCode 101&#xff1a;力扣刷题指南 使用C完成相关题目&#xff0c;以训练笔试 贪心 采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候&#xff0c;需要用到百度站长平台&#xff08;资源平台&#xff09;的工具&#xff0c;在站长工具中【普通收录】-【资源提交】-【API提交】这个功能&#xff0c;对网站的抓取进行一个提交。 这里估计很多站长就有疑问&#xff0c;如果我主动推送&#xf…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具&#xff0c;是由JAVA开发而成 2. Jenkins是一个调度平台&#xff0c;本身不处理任何事情&#xff0c;调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature&#xff0c;AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了&#xff0c;这次瞄准了量子计算领域。 今天凌晨&#xff0c;新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

Unable to find image ‘hello-world:latest‘ locally

网上对于这个问题的解答有很多了&#xff0c;我尝试了后并有解决&#xff0c;最后发现重启指令并没有使用sudo导致的。这里写一下总的解决方法&#xff1a; 1 查看是否已经有了hello-world sudo docker info如果有hello-world&#xff0c;就先删除 sudo docker rmi hello-w…

Web3.0安全开发实践:Clarity最佳实践总结

在过去的一段时间里&#xff0c;CertiK团队对比特币生态系统及其发展进行了深入研究。同时&#xff0c;团队还审计了多个比特币项目以及基于不同编程语言的智能合约&#xff0c;包括OKX的BRC-20钱包和MVC DAO的sCrypt智能合约实现。 现在&#xff0c;我们的研究重点转向了Clar…

Chrome离线安装包下载

1、问Chrome的官网&#xff1a;https://www.google.cn/chrome/ 直接下载的是在线安装包&#xff0c;安装需要联网。 2、如果需要在无法联网的设备上安装Chrome&#xff0c;需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址&#xff1a;https://www.google.c…

【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏

给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中&#xff0c;Alice 可以从 nums 中选择所有个位数 或 所有两位数&#xff0c;剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和&#xff0c;则 Alice 获胜。 如果 Alice 能赢得这场游…