Maven中的Scope

scope取值

  1. compile

    • 默认为compile,什么都不配置就意味着compile
    • compile表示被依赖项目需要参与当前项目的编译、测试、运行
    • 打包的时候,compile也会被打包进去
  2. test

    • 仅参与测试相关的工作,包括测试代码的编译、执行
  3. runtime

    • 被依赖项目无需参与项目的编译,但是需要参与后期的测试和运行
    • 与compile相比,仅跳过编译,与compile区别不是很大
    • 案例:JSR xxx等,API Jar是compile的,具体实现是runtime的,编译时只需要知道接口即可
    • 案例:jdbc驱动框架,jdbc相关api是compile,而具体实现可以通过Class.forName获取
    • 备注:可以与optional搭配使用,optional为true,则可以用A实现也可以用B实现
  4. provided

    • 打包时可以不用打包进去,别的设施会提供
    • 该依赖理论上可以参与编译、测试、运行等周期
    • 相比于compile,在打包阶段做了exclude动作
  5. system

    • 从参与角度来说,与provide相同
    • 依赖项不会被maven仓库抓,而是从本地文件系统拿
    • 一定需要配合systemPath属性使用

scope依赖传递

A -> B -> C。

知道了B在A项目中的scope,如何知道C在A中的scope呢?

  1. 如果C是test或者provided,C直接被抱起,A不依赖C
  2. 否则A依赖于C,C的scope继承于B的scope

参考资料

  1. Maven依赖中的scope详解spring-boot-starter-tomcat