Maven Scope(依赖范围)小总结
Maven Scope(依赖范围)小总结
先来下比较官方解释:
在Maven的世界中,有很多种classpath,编译classpath,测试classpath,运行classpath
依赖范围就是用来控制依赖与这三种classpath的关系
compile:编译依赖范围。如果没有指定,则默认使用该依赖范围。使用此范围的依赖,在编译,测试,运行着三种classpath都有效。
test:测试依赖范围。使用此范围的依赖,只对测试classpath有效,即只有在测试的代码中才可用。典型例子就是Junit
provided:已提供依赖范围。使用此范围的依赖对于编译和测试都有效,但在运行时无效。典型例子就是servlet-api
runtime:运行时依赖范围。使用此范围的依赖对于测试和运行classpath有效,但在编译主代码是无效。典型例子就是JDBC驱动实现
system:系统依赖范围。对于编译和测试有效,但在运行时无效。使用system范围时,必须通过systemPath元素显示的指定依赖文件的路径(慎用)
import:只支持pom类型的依赖,而且必须在存在于模块pom.xml的dependencyManagement配置区内。 这功能是用来解决pom.xml 只能单继承不能多继承问题,利用组合而不是继承关系引入依赖。最经典的是springboot。
接下来说说 比较难理解的依赖范围:provided和runtime
provided,说的是该依赖中scope标注了provided, 表示编译和测试都会引入该依赖包,但运行时不引入该依赖包,不会被打包到部署的工程文件中,运行时该依赖包由容器提供。这种情况更多适用基础模块依赖,如servlet-api,作为web servlet容器基础依赖。该依赖包不具有传递性。
runtime, 说的是该范围的依赖不需要在编译阶段使用,只有在测试及运行时才存在。也会存在于打包后的部署文件中。该依赖是在运行时需要时,动态加载代码,如JDBC驱动。一般是通过动态加载或接口反射加载的情况比较多。
http://www.cnblogs.com/jager/p/5540788.html
http://blog.csdn.net/mn960mn/article/details/50894022
https://segmentfault.com/a/1190000005062416