scope控制 dependency 元素的使用范围
compile(默认)
如果没有指定scope,那么该元素的默认值为compile。被依赖项目需要参与到项目的编译、测试、打包、运行等阶段,打包时通常会包含被依赖项目,是比较强的依赖。
provided
被依赖项目理论上可以参与到项目的编译、测试、运行等阶段,当时在打包时进行了exclude动作。
应用场景:例如我们在开发一个web项目,在编译的时候我们需要依赖servlet-api.jar,但在运行时我们不需要这个jar,因为它已由应用服务器提供,这是我们就需要用provided来修饰这个依赖包。
runtime
顾名思义,表示该依赖项目无需参与到项目的编译,但会参与到测试与运行阶段。
应用场景:例如在编译时我们不需要JDBC API的jar,但在运行时才需要JDBC的驱动包。
test
表示该依赖项目仅会参与到项目的测试阶段。
应用场景:例如,Junit 测试。
system
与provided类似,但是被依赖项不会从maven仓库查找依赖,而是从本地系统中获取,systemPath元素用于指定依赖在系统中jar的路径。
<dependency>
<groupId>com.cjf</groupId>
<artifactId>auth-center</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${basedir}/lib/auth-center.jar</systemPath>
</dependency>
import
它只使用在dependencyManagement中,我们知道maven和java只能单继承,作用是管理依赖包的版本,一般用来保持当前项目的所有依赖版本统一。
例如:项目中有很多的子项目,并且都需要保持依赖版本的统一,以前的做法是创建一个父类来管理依赖的版本,所有的子类继承自父类,这样就会导致父项目的pom.xml非常大,而且子项目不能再继承其他项目。
import为我们解决了这个问题,可以把dependencyManagement放到一个专门用来管理依赖版本的pom中,然后在需要用到该依赖配置的pom中使用scope import就可以引用配置。例如:
spring-cloud-alibaba-dependencies 依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上面代码通常为了获取继承来的pom.xml里面的<properties>里的各种包的版本号之类的信息,没有的话就不能确定版本,当然报错。
也就是说 “<artifactId>spring-cloud-alibaba-dependencies</artifactId>”是一个pom.xml文件。 所以我们就要把type类型写成<type>pom</type>,然后由于我们是引入“<artifactId>sspring-cloud-alibaba-dependencies</artifactId>”这个pom.xml文件里的<properties>里的各种包的版本号之类的信息所以scope就用 <scope>import</scope>。
当<type>pom</type>为pom时 scope必须为<scope>import</scope>