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依赖范围

maven依赖范围_Maven依赖范围相关推荐

  1. maven的依赖范围_Maven依赖范围

    maven的依赖范围 介绍: 管理依赖项是Maven的核心功能. 在定义Maven依赖项时, scope属性定义了该依赖项在不同的Maven生命周期阶段(例如build,test和run)上的可见性. ...

  2. mysql maven 依赖关系_Maven依赖总结

    一:依赖范围 Maven在编译项目主代码的时候需要使用一套classpath.其次,在编译和执行测试的时候会使用另外一套classpath.最后,实际运行Maven项目的时候,又会使用一套classp ...

  3. maven 排除pom依赖_Maven依赖排除 禁止依赖传递 取消依赖的方法

    大家都知道Maven的优点是依赖管理,特别是前期使用ANT的开发者都有很多感触.最近要开发一个java工程,定的要使用maven,会使用hadoop和hbase的客户端,而引入一个hadoop-cli ...

  4. maven 构建依赖树_Maven构建依赖项

    maven 构建依赖树 熟悉发行版和快照依赖关系的Maven和Gradle用户可能不了解TeamCity快照依赖关系,或者假定他们与Maven相关(这是不正确的). 熟悉工件和快照相关性的TeamCi ...

  5. maven依赖的jar包版本不一样_Maven依赖jar包冲突常见的解决方法

    项目中,经常会遇到ClassNotFound,NoSuchMethod异常,第一反应往往是类路径不对,jar没有正确的引用.第一步判断jar是否加载,还是 加载的jar由于maven依赖管理存在传递依 ...

  6. maven asm 依赖配置_Maven教程_v20201119

    Maven是什么?它的作用有哪些? Maven安装配置和目录结构详解 创建Maven项目(cmd命令) Maven生成站点和报告文档(cmd命令) 使用MyEclipse建立maven项目 使用MyE ...

  7. maven依赖冲突解决_Maven依赖树–解决冲突

    maven依赖冲突解决 Maven Dependency Tree is very helpful in understanding the project dependencies and reso ...

  8. maven 排除某个类_Maven依赖排除的问题和答案

    一.手工排依赖 前言 直接输出冲突的jar文件:mvn dependency:tree -Dverbose > tree.log Jar包冲突会遇到ClassNotFoundException, ...

  9. maven 打包指定依赖包_maven打包加入依赖包以及加入本地依赖包的方法

    Maven引入本地Jar包并打包进War包中 1.概述 在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来. 2. 拷贝至项目根目录 项目 ...

最新文章

  1. 还分不清 Cookie、Session、Token、JWT?
  2. C# 的tcp Socket设置自定义超时时间
  3. 【多线程学习笔记】sychronized关键字底层原理、sychronized与ReentrantLock、volatile和synchronized
  4. java中用数组模拟的酒店管理系统
  5. Anaconda+vscode+pytorch环境搭建
  6. html中依次展开的搜索框,jQuery+CSS3动画展开收缩搜索框特效
  7. 【福利】3980元的web前端视频教程限量领取!!!
  8. android 测量字体宽高,Android中测量Text的宽度和高度
  9. openstack vm实例pxe无法启动
  10. 机器学习十大算法的核心思想、工作原理、适用 情况及优缺点
  11. 如何画好软件项目架构图?
  12. ffmpeg转码命令
  13. 如何做好一位合格qc_如何做好现场QC,一位老QC的经验分享
  14. vc linux 中文版下载64位,VSCode 64位下载
  15. python模拟登陆微博_Python模拟微博登陆的实例讲解
  16. iOS之HomeKit
  17. 对于导入UE4中的模型坐标原点不在物体中心的解决办法
  18. moses 编译_MOSES安装以及使用说明
  19. String字符串的相关语法及JPI
  20. 【解决方案】如何通过国标GB28181协议视频平台EasyGBS搭建安监局危化品可视化监控平台?

热门文章

  1. P2048 [NOI2010] 超级钢琴(RMQ 贪心)
  2. CF536C-Tavas and Pashmaks【凸壳】
  3. P3599-Koishi Loves Construction【构造,数论】
  4. nssl1460-逛机房【bfs】
  5. POJ2115-C Looooops【扩欧,同余】
  6. 【2018.5.12】模拟赛之四-ssl2416 条形图【高精度,dp】
  7. codeforces1497 E. Square-free division(数学+dp)
  8. 【二分】递增(luogu 3902)
  9. 【dfs】简单游戏(jzoj 2121)
  10. Hadoop入门(七)Mapreduce高级Shuffle