首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Maven依赖作用域与传递依赖

Maven是一个Java项目的构建工具,它通过管理项目的依赖关系,简化了项目的构建和管理过程。在Maven中,依赖作用域和传递依赖是两个重要的概念。

  1. 依赖作用域(Dependency Scope): 依赖作用域定义了依赖在不同阶段的可见性和使用范围。Maven提供了以下几种依赖作用域:
    • compile:默认的依赖作用域,表示依赖在编译、测试、运行等阶段都可见和可用。
    • test:表示依赖仅在测试阶段可见和可用,不会被打包到最终的构建产物中。
    • provided:表示依赖在编译和测试阶段可见和可用,但在运行阶段由JDK或容器提供,不会被打包到最终的构建产物中。
    • runtime:表示依赖仅在运行阶段可见和可用,不会被打包到最终的构建产物中。
    • system:类似于provided,但需要显式指定依赖的路径,不推荐使用。
    • import:仅用于<dependencyManagement>中,表示导入其他项目的依赖管理信息,不会实际引入依赖。
    • 依赖作用域的选择取决于依赖的使用场景和需求,合理使用不同的作用域可以减少构建产物的大小,提高构建效率。
  • 传递依赖(Transitive Dependency): 传递依赖指的是当一个依赖引入到项目中时,它所依赖的其他依赖也会被自动引入。Maven通过依赖的传递性,自动解决了项目中复杂的依赖关系。
  • 例如,如果项目A依赖于库B,而库B又依赖于库C和库D,那么当项目A引入库B时,Maven会自动下载并引入库C和库D。
  • 传递依赖可以简化项目的配置和管理,但也可能导致依赖冲突和版本不一致的问题。为了解决这些问题,可以使用Maven的依赖排除(<exclusions>)机制来排除不需要的传递依赖,或者使用依赖调解(Dependency Mediation)机制来解决依赖冲突。

总结: Maven的依赖作用域和传递依赖是项目构建和管理中的重要概念。合理使用依赖作用域可以控制依赖的可见性和使用范围,减少构建产物的大小;而传递依赖可以自动解决项目中复杂的依赖关系,简化项目的配置和管理。在使用Maven时,需要根据项目的需求和场景选择合适的依赖作用域,并注意处理依赖冲突和版本不一致的问题。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云开发者工具 Maven 插件:https://cloud.tencent.com/product/maven-plugin
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

说说maven依赖冲突,依赖调解,依赖传递依赖范围

maven依赖冲突之前需要先说说maven依赖传递依赖传递 当前项目引入了一个依赖,该依赖依赖也会被引入项目。...更加准确的说法是,maven会解析直接依赖的POM,将那些必要的间接依赖,以传递依赖的形式引入到当前项目中。 为什么说是’必要的间接依赖‘呢?这是因为不是所有的间接依赖都会被引入的。...依赖范围除了控制classpath,还会对依赖传递产生影响。如果A依赖B,B依赖C,则A对于B是第一直接依赖。B对于C是第二直接依赖。A对于C是传递依赖。...结论是:第一直接依赖的范围和第二直接依赖的范围决定了传递依赖的范围。...如果依赖范围合适的话,B中依赖的X也是会传递到A项目中的。而两个X的版本不一致,这就产生了依赖冲突。 在依赖冲突发生时,maven不会直接提示错误,而是用一套规则来进行 依赖调解。

1.2K30

Maven - 依赖范围和传递依赖

system 系统依赖范围。该依赖范围provided所表示的依赖范围一致,对于编译和测试classpath有效,但在运行时无效。...由于此类依赖不是通过Maven仓库解析的,而且往往本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用,systemPath元素可以引用环境变量。...Maven传递依赖 什么是传递依赖 有时候我们在pom.xml文件中引入的依赖,其本身就需要依赖于其他的依赖,这时候我们不需要去考虑这些依赖Maven会解析各个直接依赖的pom,将那些必要的间接依赖...,以传递依赖的形式引入到当前的项目中。...通过传递依赖,我们可以在pom.xml文件中少写不少的依赖配置 传递依赖依赖范围 假如当前项目为A,A依赖于B,B依赖于C。

1.1K10
  • 站住,Maven依赖的scope作用,还记得几个?

    小明今天带大家回顾一下maven依赖作用 在POM中,引入了,它主要管理依赖的部署。...system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。 依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。...已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。 runtime (运行时范围) runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。...system (系统范围) system范围依赖provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。...注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

    53310

    站住,Maven依赖的scope作用,还记得几个?

    小明今天带大家回顾一下maven依赖作用 在POM中,引入了,它主要管理依赖的部署。...system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。 依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。...已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。 runtime (运行时范围) runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。...system (系统范围) system范围依赖provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。...注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

    70320

    Maven依赖作用你到底用对了没有

    今天胖哥就来说明一下Maven引用依赖的一个要点概念——作用。 要选择正确的scope scope是Maven坐标的一个关键字,它主要来限制依赖作用。...它有五种类型: Maven依赖作用 选择合理的作用,能够避免一些依赖引用问题。...compile 这是我们大部分情况下使用的引用作用,它也是Maven默认的scope值,表明该依赖从Java代码编译、测试以及运行时都会参与其中。...这里之所以要说一说,是因为它也能控制依赖作用,只不过它的场景和上面的不一样。它用来声明依赖是否是可选的(optional)而不向上传递。 来举一个例子,胖哥开发了一个类库,使用了lombok。...总结 依赖作用在开发中一定不要忽略,选择合理的作用能让你项目的依赖更加合理和“干净”。看了本篇后,赶紧去看看你项目的依赖引用是否合理吧。

    52610

    Maven 依赖调解源码解析(三):传递依赖,路径最近者优先

    场景 A有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X是A的传递依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被Maven解析使用呢?...这个方法中,以访问者方式序列化依赖关系,这里面用到的visitor 是 BuildingDependencyNodeVisitor ,可以回到 maven-dependency-tree 项目查看调用链加以印证...也就是说,apache-maven-3.6.3 这个核心项目已经做出了「应该保留哪个依赖」的判断。 因此我们再次中断调试,回到 apache-maven-3.6.3 核心项目重新调试。...,准备生成结果: 可以看到,只有 isActive 的依赖才会被收集到结果中,也就是最终起作用依赖版本。...标记,可以不考虑) 路径最远者优先 回到刚才的调解过程可以看到,默认调解器是「路径最近者优先」: 所以可以猜测,本文中其余的原则应该没有使用其他的调解器,它们应该是在某些插件中起作用的。

    56330

    Maven精选系列--依赖范围、传递、排除

    今天讲讲如何管理依赖,及依赖的范围、传递性等特征。 添加依赖 下面我添加了一个spring-web的依赖maven就会去下载spring-web的jar包及它依赖的一些jar包。...Maven2.0.9之后新增的范围,只能用在中,并且导入的type为pom类型的父工程配置,一般用来解决多继承问题。...依赖传递 依赖传递前面讲过通过继承和聚合的方式可以达到,通过继承的方式可以轻松的从父项目继承过来,通过聚合的方式也可以间接的传递过来。...继承:A继承B,A就可以继承B的dependencies依赖。 聚合:A依赖C,C依赖D,那么A就要依赖D自然也就获取了D的依赖。 下面这是dubbo的直接依赖和所有间接依赖的关系列表。...依赖排除 在依赖传递过程中,如A依赖B、S2.0,B依赖C、S1.0,这样A就有了S1.0和S2.0两个依赖,这样某些情况下会造成冲突需要手动把B间接传递过来的依赖排除掉,就是不依赖B带过来的S1.0的包

    1.2K120

    【Android Gradle 插件】Android 依赖管理 ④ ( 常用依赖配置分析 | implementation 依赖作用 | api 依赖作用 | compileOnly 依赖作用 )

    , 发现依赖传递后 , 还要 添加依赖依赖 ;因此 这两个 依赖方式 不常用 , implementation 依赖是当前最常见的依赖方式 ; 三、api 依赖作用 ---- api 依赖作用 :... compile 依赖 作用类似 , 编译打包 : 依赖会参与到 编译 构建过程 , 并且会 打包到 Apk 文件 中 ; 依赖传递 : 如果其它工程依赖本模块 , 则会 将依赖传递到其它工程 中 ;...由于这种 依赖会进行传递 , 如果修改了这个依赖库 , 沿途所有依赖该库的项目模块 , 都需要重新编译 , 会极大增加编译构建时间 , 能不用就不用 ; 推荐使用 implementation 依赖...; compileOnly 依赖作用 已废弃的 provided 依赖 类似 , 都是 将依赖库添加到编译路径中 ; 在 根目录的 build.gradle 顶层构建脚本 中的 buildScript...脚本块 中 , 使用了 classpath 依赖 , 该类型的依赖只应用在 buildScript 脚本块 , 其作用也是 将依赖库添加到编译路径中 , compileOnly 依赖 和 provided

    1.7K10

    Maven 依赖

    Maven 解析依赖信息时,首先会到本地仓库中查找依赖的 Jar 包 对于本地仓库中没有的依赖,就会去中央仓库查找,通过 Maven 坐标来获取 jar 包,获取到后会先下载到本地仓库 对于中央仓库中不存在的依赖包...,就会显示编译失败 ② 如果依赖的是自己或者团队开发的 Maven 工程,需要先使用 install 命令把被依赖maven 工程的 jar 包安装到本地仓库中 ③ 依赖范围,scope 配置就是依赖的范围...runtime:只在运行时使用,如 JDBC 驱动,适用于运行和测试阶段 4. test:只在测试时使用,用于编译和运行测试代码,不会随项目发布 5. system:类似 provided,需要显式提供包含依赖的...jar,Maven 不会在 Repository 中进行查找

    95310

    Maven依赖管理 - 引入依赖

    Maven依赖管理 - 引入依赖 依赖管理(引入依赖) 1.目标 能够掌握依赖引入的配置方式 2.路径 导入依赖 导入依赖练习 依赖范围 3.讲解 3.1导入依赖 导入依赖坐标,无需手动导入jar包就可以引入...在pom.xml中使用标签引入依赖。 做项目/工作里面 都有整套的依赖的, 不需要背诵的. 或者可以去Maven官网找, 复制,粘贴即可....--引入servlet的依赖--> <!...image-20201213200903462 其中范围的说明如下: compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖 例如:strus-core、spring-beans...如果是导入一些特定, 可以查阅网站,直接拷贝 作用范围 compile 编译、测试、打包运行部署 有效 【默认】 provided 编译, 测试 有效.

    1.7K10

    Maven 依赖管理

    摘要 作为开发者,我们一直使用 Maven 来作为版本依赖管理工具,不过我们经常会遇到依赖冲突等问题,我们这边文章就来明确一下 Maven 是如何管理依赖版本的。...: 修改是向后兼容的,一般表示引入了新功能 IncrementalVersion: 修改是向后兼容的,一般用于bug 修复 Maven依赖的选择策略 假设有一个项目P, 它有如下的依赖图: ?...那我们在构建的时候,哪些依赖会包含在构建中呢? 这就涉及到Maven依赖选择策略,Maven 有两条依赖选择规则: 1. 距离根节点最近的依赖会被选择使用 2....我们可以使用 exclude 方式将 Z 1.0 排除出依赖 总结 Maven依赖管理很灵活,但是当有很多的依赖时,很容易会造成依赖选择的不正确。...其实更真实的说法是,Maven 使用的这种依赖选择策略是有问题的,当遇到依赖冲突时,抛出异常由程序员决定选择哪个依赖是更好的选择,Maven 的这种选择依赖的方式运气好一点的在启动或测试时发现,运气不好等到上线甚至埋藏很久才会运行异常

    70020

    maven 项目依赖

    什么是依赖 依赖作用可以将项目以包的方式引用到当前项目中进行使用。 实际上平时引用的jar包都看可以看成是一个个子项目被引入到了项目中。...project03 还会自动得到project01、project02中的所引用的jar包,这叫依赖传递。 project01 中所包含的包:junit,也会被project03续承。...3.8.1 显示的效果 图片 依赖传递可以是链条式的一个引一个...依赖范围 有几种项目类型 compile: 默认 test: 不被传递 system: 本系统 optional:可选依赖 实际开发中,并不是需要的包都需要被依赖,有些包只需要在本项目中进行依赖,并不需要被外部引用到如测试用到的包...scope:依赖范围 doptional:标记依赖是赖可选 exclusions:用来排除传递依赖 scope 属性: test: 测试的时候需要这个依赖,编译、打包、发布这个依赖都不会被生效。

    23240

    Maven 依赖管理

    Maven 坐标 3. 依赖冲突 3.1 冲突产生原因 3.2 解决冲突的办法 1....前言 在我们创建使用 Maven 项目的过程中,当需要用到第三方的控件时,都是通过依赖管理来达成,也就是 Maven 项目中必有的 pom.xml 文件。...「classifier」:帮助定义构建输出的一些附属构建,主构件对应。 「dependencies」:添加项目所需的 jar 所对应的 Maven 坐标。...依赖冲突 3.1 冲突产生原因 Maven 项目中,通常都会定义血多 dependency,每个 dependency 内部也会定义它的 dependency,而有时各个依赖之间会产生冲突,冲突的原因通常主要是...「由于 jar 包依赖传递性」,如果在一个项目中同时引入了一个依赖的不同版本,就可能导致依赖冲突。

    87120

    quarkus依赖注入之二:bean的作用

    ://lordofthejars.github.io/quarkus-cheat-sheet/#_injection 作为《quarkus依赖注入》系列的第二篇,继续学习一个重要的知识点:bean的作用...(scope),每个bean的作用是唯一的,不同类型的作用,决定了各个bean实例的生命周期,例如:何时何处创建,又何时何处销毁 bean的作用在代码中是什么样的?...,如果按来源区分一共两大类:quarkus内置和扩展组件中定义,本篇聚焦quarkus的内置作用 下面是整理好的作用一览,接下来会逐个讲解 image.png 常规作用和伪作用 常规作用,quarkus...ApplicationScoped ApplicationScoped算是最常用的作用了,它修饰的bean,在整个应用中只有一个实例 RequestScoped 这是当前http请求绑定的作用,...,如下图蓝框,代理类日志出现 Dependent Dependent是个伪作用,它的特点是:每个依赖注入点的对象实例都不同 假设DependentClinetA和DependentClinetB都用

    54860

    【Android Gradle 插件】Gradle 依赖管理 ⑦ ( dependencies 传递依赖设置 | transitive 关闭依赖传递配置 | exclude 排除子依赖配置 )

    文章目录 一、dependencies 依赖传递层级 二、transitive 关闭依赖传递配置 三、exclude 排除子依赖配置 Android Plugin DSL Reference 参考文档...://developer.android.google.cn/studio/build/dependencies Android Gradle 插件配置 Gradle 配置关联 : 【Android...Gradle 插件】Gradle 依赖管理 ① ( org.gradle.api.Project 配置 | Android Gradle 插件配置 Gradle 配置关联 ) ★ Android...参考文档 : https://developer.android.google.cn/studio/build/dependencies 一、dependencies 依赖传递层级 ---- 在上一篇博客中...com.facebook.fresco:fbcore:0.14.0 , com.facebook.fresco:imagepipeline:0.14.0 也会加载进来 ; 二、transitive 关闭依赖传递配置

    90720
    领券