在Maven的依赖管理中.
目前有6种类型的scope他们分别是,compile,provided, test,runtime,system,import
在详细介绍他们之前,首要要理解一下,maven世界中的3种classpath和2种source(resources)
1. source与resources
我们都知道在maven的规范中,
要求我们使用2个source 目录分别存放项目源代码和测试源代码。
要求我们使用2个resource 目录分别存放项目源(配置)文件和测试(配置)文件。
|---src
|---main
|---java
|---resources
|---test
|----java
|----resources
当然了,不按照maven规定的默认路劲来摆放,也可以按照你自己一套来摆放。但是不是很建议这么做, 因为Maven默认的这2个路劲可以适用绝大多数的项目了,除非说你做构建的程序的目录层级结构很怪异,或者说 maven的这一套已经不适用了,那么可以自己定义了。但是不管你怎么定义,在maven的世界里面 就这2种类型的源代码路劲,比如说我可以这么定义:
/main/ejb/ ---> 放源代码
/main/jee/ ---> 放源代码
/main/mobile ---> 放源代码
/test/ejb/ ---> 放测试代码
/test/jee ---> 放测试代码
/test/mobile/ ---> 放测试代码
所谓配置文件,无非就是框架和规范要求使用的一些文件,比如说 log4j,hibernate jpa spring等的配置文件。当然了,和source 类似,你也可以不按照maven默认的路径来摆放。但是 也不是很建议这么做,理由同source
要注意的是,如果说你在源代码写了一段主函数 运行起来并且是需要加载这些配置文件的,那么这段程序是会在源代码目录里面和源配置文件目录里面去需找所需要的这些配置文件。除非说 你在加载这些文件的时候使用的是系统绝对路劲, 那么你就可以完全忽略maven的规定了。也有一些框架 就是这么规定说,把log4j.properties放到哪里哪里,这个时候 就按部就班吧,该放哪放哪了。
2. Classpath
2.1 Test classpath
这个classpath 表示的是 在编译测试代码的时候使用的一个classpath,在编译测试源代码的时候,或者说 在执行单元测试(junit)的时候或者说执行测试源代码主函数的时候,会加载这个 test classpath,所以说,单元测试所需要加载的jar包之类的是需要放进这个classpath里面的
2.2 Compile Classpath
这个classpath 表示的是 在编译源代码的时候使用一个classpath, 在编译源代码的时候或者说执行源代码主函数的时候,会加载这个 compile classpath,所以说,源代码所需要加载的jar包之类的是需要放进这个classpath里面的,比如说你使用了hibernate这个框架来做数据存储,那么你需要把hiernate需要的一些包放到这个classpath中
2.3 Runtime Classpath/Container Classpath
package classpath 或者container classpath
这个classpath 表示的是 在打包的时候会这些classpath里面的jar包一同放到你所打的包里面了,比如说你打的包里面用到了spring,而且呢你部署的那个服务器上面的类库也没有spring,那么就需要把spring放到package的classpath
言归正传了,在maven依赖管理中,定义的scope其实就是告知maven 这个依赖是使用到哪个classpath中。
其中 compile 是maven默认的一个scope。
其中需要注意的是provide和system虽然范围一样,但是 system表示的使用本地非仓库的依赖包,需要额外定义一个systemPath的属性,告知jar包的路劲
| Test Classpath | Compile Classpath | Package Classpath |
compile | Y | Y | Y |
provided | Y | Y | |
test | Y | | |
runtime | Y | | Y |
system | Y | Y | |
3 关于 import
这是个用于maven 继承机制的的一个特殊的scope。