maven简介以及 Dependency Scope详解

前言

Maven 是一个开源的构建工具,用于管理 Java 项目的构建、依赖管理和项目信息管理。它提供了一种标准化的项目结构和构建流程,简化了项目的构建和部署过程。

maven特点以及功能

依赖管理:Maven 提供了强大的依赖管理功能。通过在项目的配置文件(pom.xml)中声明依赖项,Maven 可以自动下载和管理项目所需的依赖库。它可以从中央仓库或其他远程仓库中获取依赖,并处理依赖的传递性。

构建自动化:Maven 提供了一套标准化的构建生命周期和构建插件机制。通过配置构建插件和目标,可以自动执行编译、测试、打包、部署等构建任务。Maven 通过简单的命令行接口或集成开发环境(IDE)插件,使构建过程变得简单和可重复。

标准项目结构:Maven 鼓励使用一种标准化的项目结构,使开发人员能够更容易地理解和维护项目。项目结构包括源代码目录、资源目录、测试代码目录等,这些目录结构在 Maven 中有固定的约定。

插件生态系统:Maven 拥有丰富的插件生态系统,使开发人员可以扩展构建过程和添加自定义功能。插件可以用于各种任务,如代码质量检查、静态分析、测试覆盖率报告等。

多模块支持:Maven 支持多模块项目,其中一个项目可以包含多个子模块。这些子模块可以相互依赖,并共享父项目的配置和依赖。这使得大型项目的管理和构建变得更加灵活和可控。

仓库管理:Maven 使用中央仓库作为默认的依赖库,并提供了一个集中的地方来分享和发布项目的构件。开发人员还可以配置私有仓库来管理自己的构件。

生命周期和插件机制:Maven 定义了一套标准的构建生命周期,包括清理、验证、编译、测试、打包、部署等阶段。每个阶段都与 Maven 插件关联,可以在不同的阶段执行自定义的构建任务。

Dependency

maven中引入一个依赖 只需要在 dependencies中新加一个dependency 即可
示例如下

<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

Scope

scope翻译:依赖的范围
官方说明: The scope of the dependency
可选值: compile runtime test system provided
作用: Used to calculate the various classpaths used for compilation, testing, and so on. It also assists in determining which artifacts to include in a distribution of this project.
翻译过来: 用于计算用于编译、测试等的各种类路径。 它还有助于确定要包含在该项目的发行版中的工件。
官方文档说明: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#dependency-scope

官方描述:
There are 6 scopes:

compile
This is the default scope, used if none is specified. Compile dependencies are available in all classpaths of a project. Furthermore, those dependencies are propagated to dependent projects.
provided
This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. A dependency with this scope is added to the classpath used for compilation and test, but not the runtime classpath. It is not transitive.
runtime
This scope indicates that the dependency is not required for compilation, but is for execution. Maven includes a dependency with this scope in the runtime and test classpaths, but not the compile classpath.
test
This scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases. This scope is not transitive. Typically this scope is used for test libraries such as JUnit and Mockito. It is also used for non-test libraries such as Apache Commons IO if those libraries are used in unit tests (src/test/java) but not in the model code (src/main/java).
system
This scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository.
import
This scope is only supported on a dependency of type pom in the section. It indicates the dependency is to be replaced with the effective list of dependencies in the specified POM’s section. Since they are replaced, dependencies with a scope of import do not actually participate in limiting the transitivity of a dependency.

scope 属性值的含义说明:
compile(默认值):这是最常用的scope属性值。依赖项在编译、测试和运行阶段都是可见的,并被包含在最终的构建结果中(例如JAR文件)。

provided:这个scope属性表示依赖项在编译和测试阶段可见,但在运行阶段由部署环境(如Java EE容器)提供。这意味着在构建项目时,需要确保依赖项在编译和测试时可用,但在运行时不会包含它们,因为它们将由部署环境提供。

runtime:该scope属性表示依赖项在运行和测试阶段可见,但在编译阶段不需要。这意味着依赖项在编译项目时不会被包含,但在运行时和测试时可用。

test:这个scope属性表示依赖项只在测试阶段可见,不会被包含在最终的构建结果中。这些依赖项主要用于测试代码,不会影响项目的生产环境。

system:这个scope属性用于指定已经存在于系统中的依赖项。它类似于provided,但需要显式地提供元素来指定依赖项的路径。在使用system作用域时,Maven将不会尝试从远程仓库下载该依赖项。

import:这个scope属性仅适用于部分中的依赖项声明。它表示该依赖项仅用于导入传递依赖版本号,而不参与实际构建。

这个scope 还有个妙用 就是用来解决依赖的间的版本冲突
例如,如果你遇到依赖冲突,可以将相关依赖的作用范围设置为 provided 或 runtime,以便在编译时不引入冲突,或者仅在运行时解决冲突。

以下是一个示例,展示如何使用 标签来解决依赖冲突问题:

<dependencies><dependency><groupId>com.example</groupId><artifactId>dependency-A</artifactId><version>1.0.0</version><scope>provided</scope></dependency><dependency><groupId>com.example</groupId><artifactId>dependency-B</artifactId><version>2.0.0</version><scope>runtime</scope></dependency>
</dependencies>

在上面的示例中 dependency-A 的作用范围被设置为 provided,这意味着它将由容器或环境提供,而不会被打包到项目中。dependency-B 的作用范围被设置为 runtime,这意味着它在运行时可见,但在编译时不需要。

通过合理设置 标签,你可以控制依赖的可见性和传递性,以解决依赖冲突问题,并确保项目的正确构建和运行。

the end !!!

good day !!!

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

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

相关文章

[linux]信号处理:信号编码、基本API、自定义函数和集合操作的详解

一、信号的概述 1、定义 信号是 Linux 进程间通信的最古老的方式。信号是软件中断&#xff0c;它是在软件层次 上对中断机制的一种模拟&#xff0c;是一种异步&#xff08;不等待&#xff09;通信的方式 。信号可以导致一个正在运行的进程被 另一个正在运行的异步进程中断&a…

分布式id生成方案

1. UUID&#xff08;通用唯一标识符&#xff09; 实现原理 工作方式&#xff1a;UUID是通过一系列算法生成的128位数字&#xff0c;通常基于时间戳、计算机硬件标识符、随机数等元素。全局唯一性&#xff1a;算法设计确保了即使在分布式系统中也能生成全局唯一的ID。 优缺点…

PyCharm创建一个简单的Django项目

1.Django简介 Django 是一个开放源代码的 Web 应用程序框架&#xff0c;由 Python 编写而成。它遵循 MVC&#xff08;模型-视图-控制器&#xff09;的软件设计模式&#xff0c;采用了 MTV&#xff08;模型-模板-视图&#xff09;的架构。Django 的设计目标是使开发复杂的、数据…

【MATLAB源码-第162期】基于matlab的MIMO系统的MMSE检测,软判决和硬判决误码率曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 MIMO系统(Multiple-Input Multiple-Output&#xff0c;多输入多输出系统)是现代无线通信技术中的关键技术之一&#xff0c;它能够显著增加通信系统的容量和频谱效率&#xff0c;而不需要增加额外的带宽或发射功率。在MIMO系统…

Python学习DAY14_文档处理_Excel

文档处理 Excel电子表格 Python 的 openpyxl 模块让我们可以在 Python 程序中读取和修改 Excel 电子表格&#xff0c;由于微软从 Office 2007 开始使用了新的文件格式&#xff0c;这使得 Office Excel 和 LibreOffice Calc、OpenOffice Calc 是完全兼容的&#xff0c;这就意味…

WPF 两个程序之间传递参数(shell32.dll)

当前文章只是笔记&#xff0c;代码并不完善仅作参考。 完整案例&#xff1a;WPF 两个程序之间传递参数&#xff08;Process&#xff09;_wpf的exe程序传入参数-CSDN博客 主窗口 [DllImport("shell32.dll")]public static extern int ShellExecute(IntPtr hwnd, Str…

边缘计算全面概述

什么是边缘计算&#xff1f; 边缘计算是一种分布式计算概念&#xff0c;将智能集成到边缘设备&#xff08;边缘节点&#xff09;中&#xff0c;使数据能够在数据采集源附近实时处理和分析。由于边缘计算在网络边缘本地处理数据&#xff0c;而不是在云端或集中式数据中心&#…

云端巨擘:大数据与云计算的时代航向

文章目录 大数据时代大数据特点(4v1C大数据与云计算的关系 云计算云计算定义云计算特点云计算分类&#xff08;服务类型&#xff09;云计算实现机制云计算体系结构云计算的管理中间件层 大数据时代 大数据定义&#xff1a;海量数据或巨量数据&#xff0c;其规模巨大到无法通过…

学生时期学习资源同步-1 第一学期结业考试题9

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

ArrayList 是如何进行扩容的?

典型回答 ArrayList 在添加元素时&#xff0c;会自动进行扩容操作&#xff0c;它的执行步骤如下&#xff1a; 当 ArrayList 的内部数组空间不足以容纳新增的元素时&#xff0c;会触发扩容机制。ArrayList 会创建一个新的更大的数组&#xff0c;通常是当前数组长度的 1.5倍 (可…

Spring中经典的7种设计模式源码分析

一、工厂模式 Spring使用工厂模式来创建Bean对象,如BeanFactory、ApplicationContext等。工厂模式为bean的创建过程提供了一个框架,同时隔离了实例化细节,使得代码更加解耦。 BeanFactory接口 BeanFactory接口仍然是Spring工厂模式的基础,它定义了获取Bean实例的基本方法。 …

LAMP网站部署(Discuz论坛网站部署)

目录 mysql命令 语法 选项 参数 实例 安装php 安装Mariadb 关掉防火墙和selinux 启动HTTP服务 初始化数据库 查看数据库是否创建成功 修改HTTP的配置文件 浏览器打开 将以下所有目录都加上权限 最后首页效果 mysql命令 是MySQL数据库服务器的客户端工具&#xff0c;它工作在命…

【点云】激光点云建图评测

处理工具 Pcap合并软件 sudo apt install wireshark-common合并Pcap文件&#xff0c;路径为数据文件夹下&#xff0c; #mergecap -w <输出的新Pcap> <输入的Pcap> mergecap -w lidar_output.pcap slice2099-06-01/LIDAR/lidar.pcap slice2099-06-02/LIDAR/lidar…

Java错误:JDBC错误,如何解决和避免

随着Java的广泛应用&#xff0c;Java程序在连接数据库时经常会出现JDBC错误。JDBC&#xff08;Java Database Connectivity&#xff09;是Java中用于连接数据库的编程接口&#xff0c;因此&#xff0c;JDBC错误是在Java程序与数据库交互时遇到的一种错误。下面将介绍一些最常见…

从根到叶:深度理解哈希表

​​​​​​​ 一.哈希表的概念 关于查找元素时&#xff1a; 在顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查找一个元素时&#xff0c;必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) &#xff0c;平衡树中…

什么是云计算?应用场景有哪些?

云计算是通过互联网提供计算资源和服务的计算模式&#xff0c;是一种新型的计算模式&#xff0c;能够通过互联网将计算和存储资源进行集中和共享&#xff0c;云计算主要就是把有形的产品&#xff0c;如网络硬件设备、服务器、存储服务器和各种软件等转化成服务产品&#xff0c;…

Acwing-基础算法课笔记之动态规划(背包问题)

Acwing-基础算法课笔记之动态规划&#xff08;背包问题&#xff09; 一、01背包问题1、概述2、过程模拟 二、完全背包问题1、概述2、闫氏dp分析完全背包问题3、过程模拟代码模板 三、多重背包问题1、概述2、过程模拟3、多重背包问题的优化版本 分组背包问题1、概述2、过程模拟3…

postgresql 批量添加数据,存在则更新,不存在则插入

语句介绍: DO NOTHING&#xff1a;当记录存在时&#xff0c;什么都不做 DO UPDATE SET column_1 value_1, … WHERE condition&#xff1a;当记录存在时&#xff0c;更新表中的一些字段 实例语句&#xff1a; name默认为主键 存在则更新&#xff0c;不存在则插入 INSERT I…

Rockchip android7.1.2 强制第三方apk横屏显示

Rockchip android7.1.2 强制第三方apk横屏显示 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 目前市面上&#xff0c;apk有三种形…

修改vscode的相对路径计算逻辑

vscode的相对路径计算逻辑是&#xff0c;"./"表示当前项目的文件夹&#xff0c;而不是当前文件所在的文件夹 做出如下修改&#xff1a; File-->Preferences-->settings 搜索Execute in File Dir , 然后取消勾选