经常遗忘的知识点
Maven依赖Scope
scope(依赖范围) | 编译 | 测试 | 运行 | 举例 | 备注 |
---|---|---|---|---|---|
compile | Y | Y | Y | spring-core | 默认值 |
provided | Y | Y | N | jdk、servlet-api | |
test | N | Y | N | Junit | |
system | Y | Y | N | 本地的,Maven仓库之外的类库文件 | |
runtime | N | Y | Y | JDBC驱动实现 |
-
当依赖的scope为compile的时候,那么当前这个依赖的包,会在编译的时候将这个依赖加入进来,并且在打包(mvn package)的时候也会将这个依赖加入进去。
-
当依赖的scope为provided的时候,在编译和测试的时候有效,在执行(mvn package)进行打包成war包的时候不会加入,比如:servlet-api,因为servlet-api,tomcat等web服务器中已经存在,如果在打包进去,那么包之间就会冲突。
-
当依赖的scope为test的时候,指的的是在测试范围有效,在编译与打包的时候都不会使用这个依赖。
-
runtime:运行时依赖范围。对于测试与运行classpath有效,但在编译时无效,典型的是JDBC驱动,项目只需要编译JDK提供的JDBC接口,只有在测试和运行项目时才需要实现具体的上述接口的JDBC驱动。
-
System:系统依赖范围。该依赖与三种classpath关系与provided范围一致。使用system范围依赖时必须通过systempath显示指定依赖文件位置,通常不是通过maven仓库解析,往往与本机系统绑定。
举一个应用system的例子,以前写过一个modbus协议master端的java解析器,用过一个外部的jar包,就是用的system进行约束的。
<!-- 本地的jar包打成jar包或者war包 -->
<dependency>
<groupId>seroutil</groupId>
<artifactId>seroutil</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/seroUtils.jar</systemPath> <!-- ${basedir} 是当前项目里的路径和pom.xml同级的路径-->
</dependency>
以后不定期更新。。