依赖范围scope与classpath的关系
maven的依赖范围决定了不同的classpath。不同的依赖范围决定了该依赖是否出现的对应的classpath中。classpath分编译classpath,测试classpath,运行时classpath。
scope | 编译classpath | 测试classpath | 运行classpath | 典型例子 |
---|---|---|---|---|
compile | yes | yes | yes | spring-core |
test | no | yes | no | junit |
provided | yes | yes | no | servlet-api |
runtime | no | yes | yes | jdbc驱动 |
system | yes | yes | no | 本地类文件 |
---------------------------------------------------华丽的分割线------------------------------------------------------
scope里面的test要拉出来单独说一下。
我一开始对test的是有误解的,我认为编译classpath和测试classpath都会依赖使用该scope的包。
但实际情况不是这样的,我们使用mvn compile进行编译,maven默认只会去扫src/main/下面的源码。也就是说src/test/下面的源码不会去编译,我还专门去试了下,故意写错一个测试类,mvn compile还是可以编译通过的。这也解释了,为啥scope的test的依赖包,不会出现在编译classpath下面。
还看过一个帖子,有tx把测试类和生产类写在一个包下面,mvn compile去编译,怎么编都编不过去,原因就是junit的scope设置为test,这样在编译classpath下面不会出现junit,这样测试类自然就编不去。