这几天在做项目的时候遇到了scope的的问题,看到同事们写了一路径。所有看下怎么回事。
maven 依赖关系中的scope的作用。
dependency scope
在pom4中,<dependency>中引入了<scope>,它主要管理依赖的部署,目前<scope>可以使用5个值:
1.compile 缺省值,适用于所有的阶段,会随着项目一起发布。
2.provided 类似compile,期望jdk,容器或使用者会提供这个依赖,如servlet.jar
3.runtime 只在运行时使用,如jdbc驱动,适用运行和测试阶段。
4.test 只在测试时使用,用于编译和运行测试代码。不会随着项目发布。
5.system 类似provided,需要显示提供包含依赖的jar,maven不会再respository中查找它。
依赖范围控制哪些依赖在哪些classpath中可用,哪些依赖包含在一个应用中。
complile(编译范围)
compile是默认范围,如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时他们也会被打包
provided(已提供范围)
provided依赖只有当jdk或者一个容器已提供该依赖之后才使用。例如,如果开发一个web应用,你可能在编译classpath中需要可用的servlet api来编译一个servlet.但是
你不会想要在打包好的war中包含这个servlet api。这个servlet apijar由你的应用服务器或者servlet容器提供。已提供范围的依赖在编辑classpath可用,他们不是传递性的,
也不会被打包。
runtime 运行时范围
runtime依赖在运行和测试系统的时候需要,但是在编译的时候不需要。比如,你可能在编辑的时候值需要jdbc api jar.而只有在运行的时候才需要jdbc.
test 测试范围
test范围依赖,在一般的编辑和运行时都不需要,他们只有在测试编译和测试运行阶段可用。
system 系统范围
system 范围依赖和provided类似。但是你必须显示的提供一个对于本地系统中jar文件的路径。这这么做是为了运行基于本地对象编辑,而这些对象是系统类库中一部分
这样的构件应该是一直可用的。maven也不会再仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systempath元素,该范围不推荐使用。