看着官网文档结合自己的理解写了写。看官还请自行验证。
依赖scope用来限制依赖的传播,同时也会影响各种构建任务用到的classpath。
有6种可用的scope
- compile
这是默认的scope,添加依赖的时候不写scope,默认就是这个。scope为compile的时候,这个依赖在该项目的classpath都是可用的。此外,依赖该项目的其他项目也有这个依赖。 - provided
这个和compile很像。provided表明,你希望jdk或者容器(比如Tomcat)在运行时来提供这个依赖。所以scope 为provided的依赖只在编译和测试的时候可用,打包的时候会忽略这个依赖。 - runtime
runtime表明这个依赖不需要编译,就可以执行。这个依赖在runtime和test的classpath,并不在compile的classpath。 - test
test表明这个依赖并不在正常运行的时候使用。并且仅仅在测试编译和执行的时候使用。scope为test的依赖也不具有传递性。 - system
这个和provided比较相似。只不过需要自己手动提供依赖的jar包。scope为system的依赖。maven并不会帮你去maven仓库找。 - import
import只在 (type为pom的依赖)&&(该依赖在<dependencyManagement> 中)时有效。简单的理解就是把别的pom文件中的<dependencyManagement>中的内容引入到目前的<dependencyManagement>中。
每一种scope类型(除了import)都会以不同的方式影响依赖的传播性。
下面的表格我来解释一下。
最左边我们可以看做是子项目中某一个依赖的scope类型,最顶部的一行我们可以看做是主项目依赖子项目时的scope类型。然后左边和顶部交叉的地方表示在这两种scope类型的作用下,子项目中的依赖在主项目中的传递结果。
compile | provided | runtime | test | |
---|---|---|---|---|
compile | compile(*) | - | runtime | - |
provided | provided | - | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |