传递依赖的范围

----------------------siwuxie095

   

   

   

   

   

   

   

   

传递依赖的范围

   

   

1、假设有项目 A:A 依赖于 B,B 依赖于 C,即 A->B->C,则:

   

1)B 是 A 的直接依赖(也称为 第一直接依赖

   

2)C 是 B 的直接依赖(也称为 第二直接依赖

   

3)C 是 A 的传递依赖

   

   

   

   

2、直接依赖的范围与传递依赖的范围之关系表

   

  

compile

test

provided

runtime

compile

compile

×

×

runtime

test

test

×

×

test

provided

provided

×

provided

provided

runtime

runtime

×

×

runtime

   

1)最左边一列是第一直接依赖的范围

   

2)最上边一行是第二直接依赖的范围

   

3)行列交叉处是传递依赖的范围

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

转载于:https://www.cnblogs.com/siwuxie095/p/7580564.html

### Maven中依赖传递范围及其用法 Maven中的依赖传递性是指当一个模块A依赖于模块B,而模块B又依赖于模块C时,模块A可以通过这种传递机制自动获得对模块C的依赖[^1]。为了更好地管理控制这些传递依赖的行为,Maven引入了`scope`的概念来定义依赖的有效范围。 #### 默认依赖范围 如果没有显式指定依赖范围,默认情况下所有的依赖都会被赋予`compile`范围。这意味着它们在整个构建生命周期中都是有效的——即在编译、测试运行阶段都可以使用[^3]。 #### 各种Scope的作用 - **Compile Scope**: 这是最常用的也是默认的依赖范围。任何标记为此范围内的库都将参与项目的整个生命期过程,包括但不限于源码编译、单元测试执行以及最终的应用程序打包部署等环节。 - **Provided Scope**: 表明此依赖仅需存在于编译期间;然而,在实际运行环境中已由其他方提供(比如Servlet API),因此无需将其包含进最终产物里[^4]。 - **Runtime Scope**: 此类别的依赖并不需要参与到代码编写过程中(也就是不需要导入到IDE),但在应用启动之后需要用到他们完成某些功能实现,例如JDBC驱动程序就是一个典型的例子. - **Test Scope**: 只有在测试环境下才起效的组件应该设定成test级别,像JUnit这样的框架通常会被配置在这个范围内. - **System Scope**: 类似provided但是更严格一点的是system级别的资源定位方式必须通过绝对路径来进行加载而不是相对地址或者是远程仓库下载形式获取文件内容. #### Dependency Management vs Direct Declaration 尽管可以在父POM中利用<dependencyManagement>标签统一规定好所有可能涉及到外部jar包的具体版本号信息以便子工程继承下来直接调用即可减少重复劳动量同时也方便全局调整升级策略[^2], 如果某个特定场合下希望覆盖掉这部分预设好的参数值则允许单独重新声明一次新的属性集合覆盖原有设置. 以下是关于如何正确处理不同场景下的具体编码示范: ```xml <!-- Example of defining dependency with specific scope --> <dependencies> <!-- Compile-time and runtime dependencies --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- Runtime-only dependency --> <dependency> <groupId>javax.sql</groupId> <artifactId>jdbc-api</artifactId> <version>3.0</version> <scope>runtime</scope> </dependency> <!-- Provided by the container at runtime--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> ``` #### 总结 合理运用scopes可以帮助开发者精确地界定每一个第三方库适用的工作区间从而优化整体架构设计并降低不必要的复杂度提升维护效率[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值