原本想写一篇「如何自定义Spring Boot Starter」,可是为了更好理解 Starter 的一些设计理念和其中的关键点,因此提早将一些细节内容单独提取出来说解说明mysql
在 Maven pom.xml 中,你常常会看到依赖项中有相似下面的代码:spring
<dependency> <groupId>sample.ProjectA</groupId> <artifactId>Project-A</artifactId> <version>1.0</version> <scope>compile</scope> <optional>true</optional> </dependency>
这里的 <optional>true</optional>
是什么意思呢?sql
老规矩,画个图说明问题:数据库
因为 project C 使用到了两个来自 project A 的类 (OptionalFeatureAClass) 和 project B 的类 (OptionalFeatureBClass). 若是 project C 没有依赖 packageA 和 packageB,那么编译将会失败。oracle
project D 依赖 project C,可是对于 project D 来讲,类 (OptionalFeatureAClass) 和类 (OptionalFeatureBClass) 是可选的特性,因此为了让最终的 war/ejb package 不包含没必要要的依赖,使用<optional>
声明当前依赖是可选的, 默认状况下也不会被其余项目继承(比如 Java 中的 final 类,不能被其余类继承同样)maven
若是 project D 确实须要用到 project C 中的 OptionalFeatureAClass 怎么办呢?那咱们就须要在 project D 的 pom.xml 中显式的添加声明 project A 依赖,继续看下图:spring-boot
Project D 须要用到 Project A 的 OptionalFeatureAClass,那么须要在 Project D 的 pom.xml 文件中显式的添加对 Project A 的依赖工具
到这也就很好理解为何 Maven 为何要设计 optional 关键字了,假设一个关于数据库持久化的项目(Project C), 为了适配更多类型的数据库持久化设计,好比 Mysql 持久化设计(Project A) 和 Oracle 持久化设计(Project B),当咱们的项目(Project D) 要用的 Project C 的持久化设计,不可能既引入 mysql 驱动又引入 oracle 驱动吧,因此咱们要显式的指定一个,就是这个道理了设计
在 spring-boot-actuator pom.xml 文件中,有超过 20 个依赖是 optionalcode
由于 Spring Boot 不可能将不必的依赖也打包到你最终的 jar package 中,因此用到 spring boot actuator 的项目最终生成的 jar package 中不会包含这 20 多个依赖 jar,若是你要用到哪个,显式的加入到你的项目就行了
在接下来的文章,自定义 Spring Boot Starter 也是这个策略,由于 starter 是包含特定功能为其余项目服务用的,相似本文的 Project C 的角色了,到这里你理解 optional 的奥秘了吗?
若是 Project C 引入的依赖没有加 <optional>true</optional>
,Project D 又须要依赖 Project C,但只用到 Project A 的类怎么办呢?Maven 也是有解决办法的,使用 exclusion 关键字,很少说,上一段代码就懂了:
<dependencies> <dependency> <groupId>top.dayarch.demo</groupId> <artifactId>Project-C</artifactId> <exclusions> <exclusion> <groupId>top.dayarch.demo</groupId> <artifactId>Project-B</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
到这里,在你从此设计功能性依赖时,你应该明白怎样设计依赖关系了, 我这里推荐使用 optional 的形式,简单来讲,你设计的依赖什么菜都有,想吃什么菜本身 "抱蔡明" 就好,接下来咱们就模拟官方标准建立自定义的 starter...... 博客 访问恢复正常,欢迎交流
欢迎关注个人公众号 「日拱一兵」,趣味原创解析Java技术栈问题,将复杂问题简单化,将抽象问题图形化落地 若是对个人专题内容感兴趣,或抢先看更多内容,欢迎访问个人博客 dayarch.top