背景:在maven的pom.xml配置文件中,依赖有一个可选参数scope,它标识的是依赖的范围,具体是干什么用的?
举例:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.8</version>
<scope>test</scope>
</dependency>
scope的值有以下几个:
compile:默认值,表示项目在编译、运行、测试阶段都需要依赖的jar包在classpath下
test:因此只有在运行测试(例如junit)时才会import依赖
应用场景:运行测试(junit和testng)需要依赖的包可以设置scope为test,编译和运行时无需import改jar包,降低包冲突几率,提高编译效率
- provided:在编译和测试时会import依赖,运行时不会
应用场景:比如依赖很通用的jar包(如公司内部的中间件jar包),在本地编译、测试时需要import,但是实际在服务器运行时不需要import(因为通用,服务器或者容器上的classpath下已经预置了该jar包),这样可以避免重复的import导致的包冲突
- runtime:在测试和运行时会import依赖,编译时不会
应用场景:-
- system:依赖范围和provided一致,但是该依赖是存放于本地,需要由systemPath元素来显示指定依赖文件的路径
<dependency>
<group>javax.sql</group>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/rt.jar</systemPath>
</dependency>
- import 对三套依赖classpath都没有影响,较少用