maven依赖范围_Maven依赖范围

maven依赖范围

介绍:

管理依赖关系是Maven的核心功能。 定义Maven依赖项时, scope属性定义了该依赖项在不同的Maven生命周期阶段(例如build,testrun)上的可见性。

依赖范围限制了任何项目中依赖的传递性,从而影响了类路径。 此外,Maven中有六个不同的可用依赖范围。 在本教程中,我们将学习它们中的每一个。

传递依存关系:

Maven中的依赖关系可以是直接的也可以是传递的

直接依赖关系是我们明确定义POM文件的依赖关系:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

另一方面, 传递依赖是直接依赖所要求的。 所需的传递依赖项自动包含在我们的maven项目类路径中。

关键条款:

在深入学习可用的Maven范围之前,让我们首先使用一些关键术语来刷新我们的知识,

  • compile-classpath :对我们项目的主要源文件具有依赖性
  • test-classpath:保存测试编译和执行期间存在的依赖项
  • runtime-classpath :在运行时环境及其执行中将可用的依赖项

依赖范围:

现在让我们看一下不同的Maven依赖范围:

除非另有说明,否则它是Maven中默认范围 。 对于主要的源代码编译,我们需要这些依赖项 同样,我们上面讨论的所有三个类路径中都提供了编译依赖项。

这些依赖关系是可传递的,因此传播到依赖项目。

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

范围设置为test的依赖项仅在test-classpath中可用。 我们只需要这些依赖关系来编译和运行单元测试用例。 而且,它不是可传递的。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>

我们不需要运行时依赖来进行代码编译,但是非常需要它来在运行时执行代码 。 这样的依赖关系在编译类路径中不可用,但在测试类路径运行时类路径中都存在。

一个很好的例子是JDBC驱动程序的依赖关系:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version><scope>runtime</scope>
</dependency>

它是可传递的。 因此,项目包装包括所有传递依赖项。

提供的依赖项仅在compile-classpathtest-classpath中可用 。 假定运行时环境(如JDK ,Web或Servlet容器等)将在部署模式下提供依赖的JARS

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

它本质上不是可传递的。 因此,打包后,我们将无法在我们的lib文件夹中找到此范围的直接传递依赖项。

系统范围提供的范围非常相似。 在这里,唯一的区别是它是指本地系统中某个路径的依赖jar

<dependency><groupId>com.programmergirl</groupId><artifactId>my-dependency</artifactId><version>2.5.1</version><scope>system</scope><systemPath>${project.basedir}/libs/my-dependency-2.5.1.jar</systemPath>
</dependency>

使用此范围的一个缺点是我们必须在执行之前在每个系统上进行手动设置。 这样可以避免查找Maven本地存储库。 相反,它拿起在Systempath下提供的罐子 。 不出所料,此处没有传递性。

导入依赖关系范围是在Maven 2.0.9中首次引入的。 这对于基于多模块Maven的项目很有用。 要使用它,我们需要在父POM中配置<dependencyManagement> 。 另外, 它仅受<dependencyManagement>部分中类型为pom的依赖项支持。

这个想法是为了能够从其他项目中导入托管的依赖项。 因此,在我们的有效POM中 ,导入的依赖关系将替换为该项目中所有可用的有效依赖关系。

<dependencyManagement><dependencies><dependency><groupId>com.programmergirl</groupId><artifactId>my-project</artifactId><version>1.1</version><type>pom</type><scope>import</scope> </dependency></dependencies>
</dependencyManagement>

可传递性解析规则:

我们的主要打包项目不包括带有范围的项目依赖项- 提供测试 。 之所以如此,是因为它们本质上是可传递的。 为了解决具有给定范围的直接依赖项的传递性,我们具有以下规则:

  • 编译 –使用运行时引入可传递的依赖关系并编译范围,而不更改其范围
  • 测试编译运行时传递依赖项都通过我们项目中的测试范围引入
  • 运行时 –使用项目中的运行时范围提取编译运行时传递依赖项
  • 提供编译范围和运行时范围的依赖关系都将通过提供的范围引入

结论:

在本教程中,我们介绍了Maven中可用的所有六种依赖关系范围。 我们还讨论了基于Maven范围的传递依赖及其解析。

成为第一个发表评论的人。

翻译自: https://www.javacodegeeks.com/2019/05/maven-dependency-scopes.html

maven依赖范围

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

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

相关文章

雅加达poi_雅加达EE:干净的板岩

雅加达poi该公告雅加达EE不能使用javax。*名称空间是个好消息&#xff0c;并提供雅加达EE用干净的石板上构建和创新企业级Java的未来。 原始提案 可以预见&#xff0c; javax。*和jakarta。*名称空间将在Java EE 8之后共存&#xff0c;随着它的发展&#xff0c; jakarta。*名称…

Struts2的配置文件struts.xml的模板

文章目录模板标签说明packageactionresult模板 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2…

Struts2的配置文件web.xml的模板

<?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation"http://xmlns.jcp.org/xml/ns/javaee http://…

cassandra数据备份_Cassandra中的数据建模

cassandra数据备份在关系数据模型中&#xff0c;我们为域中的每个对象建模关系/表。 对于Cassandra&#xff0c;情况并非如此。本文将详细介绍在Cassandra中进行数据建模时需要考虑的所有方面。 以下是Cassandra数据建模的粗略概述。 从上图可以看出&#xff0c; 概念数据建模…

Struts2项目中的JSP如何访问Session对象

Struts2 项目中&#xff0c;Session 对象存放在 ValueStack 的 context 对象中&#xff0c;context 是 Map 对象&#xff0c;那么要从 context 对象中获取到 Session 对象&#xff0c;就要指定 key 值。我们查看 ValueStack 的内容&#xff1a; 从 ValueStack 显示的内容可以知…

pom.xml中pom全称_摆脱pom XML…几乎

pom.xml中pom全称介绍 POM文件是XML格式的文件&#xff0c;声明性地描述了要使用Maven构建的Java项目的构建结构。 维护大型Java项目的POM XML文件通常很麻烦。 XML是冗长的&#xff0c;POM的结构也需要维护冗余信息。 多次对工件进行命名是多余的&#xff0c;在groupId和artif…

IntelliJ IDEA for Mac中Maven菜单用法详解

Reload project 你如果修改了 pom.xml 文件&#xff0c;可以点击这个按钮重载 Maven 项目&#xff0c;重载过程会引入新的依赖&#xff0c;会删除不需要的依赖。 Generate Sources and Update Folders 这个按钮是将 src/main/resources 和 src/test/resources 的资源文件编译…

sql 注射_只能在测试中注射吗?

sql 注射本文是关于测试设计和可测试性的一些想法。 我们与我的儿子讨论了一些问题&#xff0c;他的儿子是Java的初级开发人员&#xff0c;目前在匈牙利的EPAM&#xff08;我工作的同一家公司&#xff0c;但在另一家公司工作&#xff09;受雇并学习。 本文中的所有内容都是很好…

IntelliJ IDEA查看方法在哪里被调用(Method Usage Search/Method Call Hierarchy)

文章目录Usage SearchCall Hierarchy区别Usage Search 搜索使用的地方&#xff0c;快捷键如下&#xff1a; 你可以把光标移到方法名称处&#xff0c;然后点击右键&#xff0c;找到 Find Usages 菜单项&#xff0c;意思是“找到使用它的地方”。 例如我要查看哪些地方调用 f…

java编程学习方法_在线学习Java编程的最佳方法

java编程学习方法1.简介 Java是使用最广泛的编程语言之一。 根据Github的最新报告 &#xff0c;Java被列为仅次于JavaScript的第二大最常用的编程语言。 掌握Java的人有很多话题。 好消息是&#xff0c;您可以在线找到很多内容。 在这篇文章中&#xff0c;我们将对所有这些主题…

hibernate 标识符_Hibernate中的标识符

hibernate 标识符Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样&#xff0c;它可以是简单的也可以是复合的。 我们可以通过几种方式定义一个Hibernate标识符。 在本教程中&#xff0c;我们将学习如何做。 …

java中延迟_Java中的延迟分配

java中延迟程序员本质上是懒惰的&#xff0c;而similis simili gaudet就像程序是懒惰的一样。 您听说过延迟加载吗&#xff1f; 还是懒惰的单身人士&#xff1f; &#xff08;不过&#xff0c;我个人更喜欢单一麦芽版本。&#xff09;如果使用Scala或Kotlin&#xff08;这也是一…

camel apache_短款Apache Camel K

camel apache您可能已经看到我们在Camel K周围的Apache Camel社区中所做的工作。 Nicola于半年前在他的博客中介绍了Camel K &#xff0c; 就在几个月前&#xff0c;我们正在讨论一个新项目&#xff0c;该项目可以作为Apache Camel的一部分启动。 一个有可能改变人们处理集成方…

java 栈 队列 接口_Java队列接口

java 栈 队列 接口介绍&#xff1a; 队列是FIFO&#xff08;先进先出&#xff09;抽象数据类型&#xff08;ADT&#xff09;。 换句话说&#xff0c;按插入顺序将元素删除。 java.util.Queue是Java 中的接口&#xff0c;并且从java.util.Collection扩展。 一些常用的Queue实现…

jakarta ee_Jakarta EE 8状态

jakarta ee遵循Jakarta EE的人们可能知道即将发布的Jakarta EE 8在功能上将与Java EE 8等效。其原因是我们想证明从Oracle的传输已经完成&#xff0c;并且我们能够产生这些流程&#xff0c;规范&#xff0c;测试套件以及通过Eclipse Foundation的兼容实现。 到目前为止&#x…

IntelliJ IDEA如何查看接口的实现类以及如何查看被实现的接口

在接口的左边有个向下的小箭头&#xff0c;点击小箭头就能看到接口的实现类和方法的实现&#xff1a; 在实现类的左边有个向上的小箭头&#xff0c;可以查看被实现的接口和被覆盖重写的方法&#xff1a;

c#自定义控件资源释放问题_定义资源

c#自定义控件资源释放问题在Fielding的论文中 &#xff0c;资源描述为&#xff1a; “可以命名的任何信息”……“文档或图像&#xff0c;临时服务&#xff08;例如&#xff0c;“洛杉矶今天的天气”&#xff09;&#xff0c;其他资源的集合&#xff0c;非虚拟对象&#xff08…

MySQL数据库存入日期(java.sql.Date)数据,天数会少一天的问题

网络上给的解决办法&#xff1a; 这是数据库服务器时区的问题&#xff0c;即连接参数 serverTimezone 的问题&#xff0c;默认情况下 serverTimezoneUTC&#xff0c;改成 HongKong 或者 Asia/Shanghai 就可以了。如下所示&#xff1a; jdbc:mysql://localhost:3306/test?useU…

spring的bean范围_Spring Bean范围

spring的bean范围介绍&#xff1a; Spring核心容器实例化bean并管理其生命周期。 在定义bean时&#xff0c;我们可以提供其范围。 除非明确提供&#xff0c;否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中&#xff0c;我们将探讨它们…

java.util.Date转换成java.sql.Date

// 获取当前的系统时间&#xff0c;以java.util.Date对象返回 Date dateUtil new Date(); // 获取当前的系统时间&#xff0c;以时间戳返回 long l System.currentTimeMillis();时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现…