最近更改最多的就是pom文件的依赖关系管理和添加,更新了很多次,一次次的交流中,发现原来对于maven的管理机制还是不懂。
一、maven的scope标签
scope标签的主要参数如下。
(1)compile 编译依赖范围
默认的scope,表示dependency,都可以在生命周期中使用。而且,这些依赖会传递到依赖的项目中。对于编译、测试、运行三种classpath都有效,并且会随着项目一起发布。
(2)test 测试依赖范围
使用了此依赖范围的Maven依赖,只对于测试的classpath有效,在编译主代码或者运行项目的时候,无法使用此依赖。典型的是junit,它只要在便一眼测试和运行测试的时候, 才会有效。
(3)Provide:已提供依赖范围
如果使用此标签,对于编译和测试时候classpath有效,但是在运行时无效。典型例子servlet-api,编译和测试项目的时候,需要该依赖,但是项目运行的视乎, 由于容器已经提供,所以不需要Maven重新引入。
(4)Runtime:运行时依赖范围。使用之后,对于测试和运行classPath有效,但是在编译主代码时候无效。
(5)System:系统依赖范围,和Provided依赖范围完全一致。使用System范围依赖时,必须通过systemPath元素显式的指定依赖文件的路径。但是,使用System范围的依赖时候必须通过systemPath显式指定依赖文件的路径。因为这个范围的依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,所以容易造成移植的不稳定性因此谨慎使用。
依赖范围(scope) | 对于编译ClassPath有效 | 对于测试classPath有效 | 对于运行时classpath有效 | 例子 |
compile | y | y | y | spring-core |
test | _ | y | - | junit |
provided | y | y | - | servlet-api |
runtime | - | y | y | JDBC驱动实现 |
system | y | y | - | 本地的,Maven仓库之外的类库文件 |
二、Provide标签在项目中的使用。
引入其他服务的api时,在scope中添加provide,避免传递依赖。
<!--依赖基础信息的API-->
<dependency>
<groupId>com.dmsdbj.itoo</groupId>
<artifactId>basicInfo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!--依赖权限的API-->
<dependency>
<groupId>com.dmsdbj.itoo</groupId>
<artifactId>authorityManagement-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!--添加单表服务的api-->
<dependency>
<groupId>com.dmsdbj.itoo</groupId>
<artifactId>singleTableMaintain-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>provided</scope>