scope取值
-
compile
- 默认为compile,什么都不配置就意味着compile
- compile表示被依赖项目需要参与当前项目的编译、测试、运行
- 打包的时候,compile也会被打包进去
-
test
- 仅参与测试相关的工作,包括测试代码的编译、执行
-
runtime
- 被依赖项目无需参与项目的编译,但是需要参与后期的测试和运行
- 与compile相比,仅跳过编译,与compile区别不是很大
- 案例:JSR xxx等,API Jar是compile的,具体实现是runtime的,编译时只需要知道接口即可
- 案例:jdbc驱动框架,jdbc相关api是compile,而具体实现可以通过Class.forName获取
- 备注:可以与optional搭配使用,optional为true,则可以用A实现也可以用B实现
-
provided
- 打包时可以不用打包进去,别的设施会提供
- 该依赖理论上可以参与编译、测试、运行等周期
- 相比于compile,在打包阶段做了exclude动作
-
system
- 从参与角度来说,与provide相同
- 依赖项不会被maven仓库抓,而是从本地文件系统拿
- 一定需要配合systemPath属性使用
scope依赖传递
A -> B -> C。
知道了B在A项目中的scope,如何知道C在A中的scope呢?
- 如果C是test或者provided,C直接被抱起,A不依赖C
- 否则A依赖于C,C的scope继承于B的scope