【思考】

首先,简单讲述一下为什么需要这样一个系统?

不知道大家有没有思考,在一个可能有上千个模块/产品的公司,对于模块之间有较多相互依赖的情况,以下问题该如何解决:

  1. 我们把一个生命周期结束的组件移除之后,会有什么影响?
  2. 在代码修改之后,我们应该run哪些dependency测试例?
  3. 在一个已部署的系统中,我们最终要使用哪个version的模块?
  4. 是否有人使用高危版本的库?

以上问题,其核心原则就是,在所有产品的整个开发周期中,在修改某个依赖的同时,不会对其他产品造成任何影响

【如何保存依赖关系】

之前的时候,考虑过使用键值对数据库和非关系型数据库去保存相关的依赖,但是效果都不理想,最后选用了图数据库(Neo4J).

这样做有三个好处:

  1. 对于任意模块,不论其是否依赖其他模块,或是被其他模块依赖,都可以很直观得在数据库中体现;
  2. 对于任意模块,其依赖的下级模块和上级模块可以快速地导出;
  3. 对于跨级依赖可以有更好的体现。

【设计】

代码结构如下:

在Model中,Dependency映射pom文件中的dependency,Project映射产品,Neo4jConn映射数据库信息。

Service中,GraphBuilder主要处理产品以及模块之间的相互依赖关系,Neo4JHandler主要处理与数据库相关的具体操作。

Util里面,Finder继承SimpleFileVisitor,处理一些路径的匹配工作,PomFileFinder利用Finder,寻找所有的pom文件并返回列表,XMLConverter利用javax.xml的工具类处理具体的xml文件。

DependencyManager作为整个程序的入口,对外提供服务。

【使用】

首先在工程目录下执行mvn clean install/package打包;

然后进入target目录下执行:

java -jar dependency-manager-0.0.1-SNAPSHOT-jar-with-dependencies.jar D:/workspace/so bolt://localhost:7687 neo4j neo4j Module org.spring*

第一个参数指定pom文件路径(默认递归到20层,超过无法识别到);

第二个参数指定数据库的url,第三个参数指定数据库用户名,第四个参数指定数据库密码;

第五个参数指定需要导出依赖关系的是产品还是模块,如果指定模块,会将所有满足条件的模块全部导出,如果只指定产品,则只导出所有产品之间的依赖关系。

第六个参数指定模块需要满足的条件,可以指定前缀,中缀,后缀,如spring*,指所有以spring开头的包,这种方式可以去掉一些我们不关注的包,比如org相关的,spring框架相关的,可以大大降低我们的工作量。

当然,你也可以直接执行:

  java -jar dependency-manager-0.0.1-SNAPSHOT-jar-with-dependencies.jar

命令来获取帮助。   

  如图所示则执行成功:

【结果】

执行结果可以在Neo4J中查看:

红色为产品,褐色为模块。

【优化】

当然了,这只是一个小应用,还有很大的发展空间,之后会有如下几个改进:

  1. Dependency Manager UI可视化,可以直接将结果通过页面的方式展示给用户;
  2. 通过自动化的方式更新依赖关系;
  3. 根据模块使用情况自动发出循环依赖以及废弃库使用的警告;
  4. 可以跨平台使用,不局限于Maven管理的Java项目。

当然,也希望有同样想法的小伙伴可以提提设计上的意见,或者阅读过源码之后有改进的思路给到,都不胜荣幸。

【获取】

  GitHub地址:https://github.com/liufarui/dependency-manager

spring处理循环依赖时序图_Maven依赖管理系统相关推荐

  1. spring处理循环依赖时序图_spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖...

    本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...

  2. maven依赖冲突解决_Maven依赖树–解决冲突

    maven依赖冲突解决 Maven Dependency Tree is very helpful in understanding the project dependencies and reso ...

  3. UML图详解(七)——交互图(时序图与协作图)

    一.概念 交互图描述对象之间的动态合作关系以及合作过程中的行为次序. 交互图常常用来描述一个用例的行为,显示该用例中所涉及的对象以及这些对象之间的消息传递情况,即一个用例的实现过程. 交互图有顺序图和 ...

  4. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. Spring当中循环依赖很少有人讲,今天让我们来看看吧

    网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...

  6. Spring当中循环依赖很少有人讲,今天一起来学习!

    网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...

  7. 图解Spring解决循环依赖

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:juejin.cn/post/684490412216 ...

  8. spring 循环依赖_简单说说 Spring 的循环依赖

    作者 | 田伟然 回首向来萧瑟处,归去,也无风雨也无晴. 杏仁工程师,关注编码和诗词. 前言 本文最耗时间的点就在于想一个好的标题, 既要灿烂夺目,又要光华内敛,事实证明这比砍需求还要难! 由于对象之 ...

  9. 【Spring】Spring 解决循环依赖的 3 种方式

    原文:http://www.javastack.cn/article/2020/spring-cycle-depends-on-three-ways/ 循环依赖就是N个类中循环嵌套引用,如果在日常开发 ...

最新文章

  1. 邻接表建立图(c语言)
  2. Java链表的基本使用
  3. 计算机网络7种类型,OSPF中7种类型LSA
  4. 思科决定将不修复路由器中的这70多个漏洞
  5. JAVA中获取工程路径的方法
  6. JavaScript页面跳转常用代码(转)
  7. HttpSendRequest向服务端发送数据,构造请求http头
  8. matlab ROR半径滤波
  9. 汇编语言 emu8086软件的安装和输出Hello,world
  10. 剑桥: 一个完美的读书地方
  11. excel画风玫瑰图_教大家Excel如何绘制线性玫瑰图
  12. 企业为什么需要EDI?
  13. 小学校本课程计算机前言,《创意手工》三河小学校本课程——序言
  14. Windows操作系统名称与版本号汇总
  15. 浅谈 裴蜀定理扩展欧几里得
  16. 单反相机的传奇—佳能单反50年辉煌之路(连载六)
  17. 如何安装adb(Android Debug Bridge)
  18. NS3-LENA源码阅读报告(1)
  19. vs读取txt文件一直失败
  20. NSLog日志输出不全问题分析与解决方案

热门文章

  1. 前端性能优化篇——浏览器http同域名并发请求对限制
  2. oracle 分割字符成数组,oracle依据分隔符将字符串分割成数组函数
  3. Python数模笔记-NetworkX(3)条件最短路径
  4. docker 删除所有镜像_Docker常用命令
  5. android ui stencil kit 下载,实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材
  6. pycharm可视化数据库
  7. 【Linux】查看文件内容的相关命令总结
  8. 超文本css样式换行
  9. 递归 与 动态规划 区别
  10. [NOIP2003]传染病控制题解