maven-依赖范围
java中编译代码、运行代码都需要用到classpath变量,classpath用来列出当前项目需要依赖的jar包
maven用到classpath的地方有:编译源码、编译测试代码、运行测试代码、运行项目
scope是用来控制被依赖的构件与classpath的关系(编译、打包、运行所用到的classpath)
compile
编译依赖范围,如果没有指定,默认使用该依赖范围,对于编译源码、编译测试代码、测试、运行4种classpath都有效
比如spring-web
test
测试依赖范围,测试依赖范围,使用此依赖范围的maven依赖,只对编译测试、运行测试的classpath有效,在编译主代码、运行项目的无法使用此类依赖
比如junit,它只有在编译测试代码及运行测试的时候才需要
provide
已提供依赖范围。表示项目的运行环境中已经提供了所需要的构件,对于此依赖范围maven依赖,对于编译源码、编译测试、运行测试中classpath有效,但在运行时无效
比如servlet-api,这个在编译和测试的时候需要引用到,但是在运行的时候,web容器已经提供了,就不需要maven帮忙引入了
runtime
运行时依赖范围,使用此依赖范围的maven依赖,对于编译测试、运行测试和运行项目的classpath有效,但在编译主代码时无效
比如jdbc驱动实现,运行的时候才需要具体的jdbc驱动实现
system
系统依赖范围,该依赖与provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显示的指定依赖文件的路径。
这种直接依赖于本地路径中的构件,可能每个开发者机器中构件的路径不一致,所以如果使用这种写法,你的机器中可能没有问题,别人的机器中就会有问题,所有应慎重使用
总结
依赖范围 | 编译源码 | 编译测试代码 | 运行测试 | 运行项目 | 示例 |
---|---|---|---|---|---|
compile | Y | Y | Y | Y | spring-web |
test | - | Y | Y | - | junit |
provide | Y | Y | Y | - | servlet-api |
runtime | - | Y | Y | Y | jdbc驱动 |
system | Y | Y | Y | - | 本地的jar包 |