前言
maven中引入jar包依赖,scope和optional配置项可以控制jar包依赖范围和依赖传递;其中scope常见的四种类型compile/test/runtime/provided。本文介绍下scope和optional常用的场景
一.依赖范围
scope | 编译阶段 | 测试阶段 | 运行阶段 | 参与打包 | 例子 |
compile | 是 | 是 | 是 | 是 | gson |
test | 否 | 是 | 否 | 否 | junit |
runtime | 否 | 是 | 是 | 是 | mysql-connector-java |
provided | 是 | 是 | 否 | 否 | javax.servlet-api |
system | 是 | 是 | 否 | 否 | 本地jar,非maven仓库 |
默认是compile,一般都是默认值。test/provided/system对用的一些常见jar包,接下来看看rumtime的使用场景。
使用runtime的地方,一般是面向接口编程,而不是面向实现编程。
比如JDK下的数据库驱动接口Driver和DriverManager,没有SPI以前,以mysql举例,我们使用
Class.forName("com.mysql.cj.jdbc.Driver");
进行注册。有了SPI之后,无需写上述触发注册代码,SPI会在查找META_INF/services下的接口
然后调用static方法进行注册。
其中我们写代码都是针对JDK下的Driver接口进行代码编写,这样的好处是当底层驱动切换时,我们可以无缝的切换驱动。比如从mysql切换到oracle。
这个时候我们将引入的驱动(例如mysql-connector-java)的scope设置为runtime,编译阶段是无法使用其中的内容的(除了反射),运行和打包阶段无影响。
二.依赖传递
1.optional为默认选项false
2.optional为true时
当B依赖A的optional为ture时,C项目中不会引入A项目
比如mybatis生成工具,dao层可以用来生成,最终项目打包依赖无需此jar包,optional设置为true
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>${mybatis-generator.version}</version> <scope>compile</scope> <optional>true</optional> </dependency>
适当的使用传递依赖排除掉jar包,可以降低jar包的大小和减少版本冲突。
总结
本文介绍了maven中的socpe和optional配置项,正确的配置项目与项目之间的依赖,而不是每个项目都引入大而全的依赖文件,导致项目臃肿,编译缓慢,冲突不断。