Maven scope 指定了Maven构建过程中依赖库的使用范围,上图给出了maven常用范围
1、compile:默认的依赖范围,表示该库在编译、测试、运行都需要用到,即:当maven进行compile(将Java源文件编译成.class文件)时,会将该库打包到编译后的源文件的目录中(classpath)即:参与编译,参与运行。
2、runtime:最难理解的一个范围,表示依赖库在运行的时候需要用到,但是在编译阶段不需要用到,即:不参与编译,参与运行。
例如:JDBC驱动。我们在代码中需要使用java.sql包的类,但是在编译的时候并不需要直接使用JDBC驱动类,因为JDBC驱动程序在运行的时候会被动态加载:通过静态资源提前记录ClassName,运行时通过解析该静态资源获取相应信息,再反射获取。因此,我们在编写代码的过程中对于runtime的包,不能直接引入包里面的类和方法,IDE会给予错误提示。
**mysql驱动设为runtime**
**mysql驱动包中的类**
**直接引入该类报错**
**改为compile**
**正常引入**
总之对于runtime的范围的类,会跳过编译阶段,但仍会打包到classpath中,参与运行时动态调用。对于所有数据库驱动都是推荐runtime范围,我们在写代码的时候只要调用jdk提供的JDBC的接口规则,具体的实现,不管是Mysql驱动还是Oracle驱动,驱动厂商都已经按照JDBC的接口规则去实现了。只需要在运行时动态调用即可。
3、test:仅在单元测试的时候能用到,如:JUnit。平时用的少,一般程序员平常很少编写测试单元和测试用例。不参与编译,不参与运行 不会打包到项目(classpath)中
4、 provided: 表示依赖库在编译和测试时需要使用,但在运行时不需要使用,因为这些依赖库由容器(如Tomcat) 提供,例如 servlet-api。参与编译,不参与运行,不会打包到项目(classpath)中。