背景:
最近在做下载模板,目前思路是通过调用考评服务的接口来下载,结果出现了循环依赖的问题。
探究:
Maven的循环依赖或者双向依赖。下图描述了相互依赖的场景:
图中模块C依赖于模块B,模块B依赖于模块A,而模块A又依赖于模块C,这样就出现了相互依赖情况,如果运行mvn compile会出现错误:
我们采用build-helper-maven-plugin解决相互依赖的问题。先把相互依赖的模块整合在一起,相当于把这些模块合并成一个单独的模块统一编译, 如下图:合并A、B、C三个模块为D模块。
这个模块D相当于我们工程里的父工程parent。我们把它当做一个辅助构建模块,然后让A、B、C模块都依赖于D模块,这样的话就可以成功编译A、B和C模块,如下图: 基于D模块来分别编译A、B、C三个模块:
循环依赖
循环依赖呢,就是模块A依赖模块B,模块B依赖模块A,形成循环依赖。或者模块A依赖模块B,模块B依赖模块C,模块C依赖模块A。
如果循环依赖发生在工程之间,则会影响构建,因为maven不知道应该先编译哪个工程。如果循环依赖发生在同一个工程的模块之间,虽然不影响编译,但是也是一种不好的实践,说明模块的设计有问题,应该避免。
怎么解决循环依赖?
1、build-helper-maven-plugin插件解决
2、重构
如何重构?
1、平移。模块A的代码平移到模块B
2、下移。模块A和模块B相互依赖,同时都依赖模块C,可以将A和B相同的代码移到模块C,这样A和B都依赖C。
我们这个问题是怎么解决的?
下载模板的循环依赖问题,我们通过重构的平移解决,这个接口用到的表是考评服务的,所以我们通过mysql的表映射,将我们需要的表映射到教务服务,这样我们可以在教务服务中写同样的接口,相当于将考评的代码平移到了教务。
表映射分享链接:
总结:
有关maven的依赖管理,我们可以排除依赖,归类依赖,优化依赖,下篇博客再见!