前提纪要
- 公司目前是gradle多模块开发 没有用到传统互联网公司的分布式 springCloud、dubbo等
- 差不多是20个jar包 一个底座war 依赖所有jar包
- 有公共模块framework、core等
问题出现
- 前面说过是多模块开发 其中有两个模块比较特殊
- 一个是 定时调度暂且称为T、一个是数据抽取Etl 暂且称为E
- 目前的业务要求是T需要调用E中的运行方法、E需要获取T中的定时运行状态以及记录
- 按照分布式的解决方法很简单就利用Rpc相互调用方法就行了 也不存在直接依赖关系
如图

解决思路
- 在gradle中 依赖关系是配置在 build.gradle 中的 如果相互依赖 在打包过程中会报错 也就是所谓的循环依赖
- 查询了很多方案 大部分人的解决方法是将冲突的业务拆出来单独依赖 但是并不能解决复杂的问题
- 所以我们取巧一下
首先解决编译问题
对于Java以及Spring而言 编译只要有类型即可 不需要有具体对象 也就是多态中常说的编译看左边 运行看右边
所以 我们新起一个公共模块common 里面定义类型 (Interface) 这时候就解决了编译的问题 所有需要调用其他模块的
方法都写在这里 这样就不会有循环依赖下面解决运行问题
光有类型是不够的 还需要有具体业务逻辑 以及运行的方法体 所以我们在各自模块 创建实现类impl 这样打包之后
所有的 class 都在底座war中 Spring可以为我们找到 并没有依赖关系的实现类并自动注入
如图

这样即使以后再出现依赖冲突 也不用再次拆包 只需要写在common中就可以啦

本文介绍了如何在不拆分模块的情况下解决Gradle多模块项目中的循环依赖问题。通过创建公共模块定义接口,并在各模块实现接口,实现了编译时类型检查和运行时的依赖注入,确保了系统的正常运行。这种方法避免了频繁调整模块结构,提升了代码的可维护性。
8万+

被折叠的 条评论
为什么被折叠?



