spring处理循环依赖时序图_Maven依赖管理系统

【思考】

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

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

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

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

【如何保存依赖关系】

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

这样做有三个好处:

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

【设计】

代码结构如下:

60edabec994334f634b7e9c878f03209.png

在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

命令来获取帮助。   

765b9ce99fbb973f050be7b37f1622c9.png

  如图所示则执行成功:

f004e1ebf16de7a1fec9bda355e22d70.png

【结果】

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

028d4e28d0ec3a40f9baf73a907f9396.png

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

【优化】

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

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

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

【获取】

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 获取本机ip_linux获取本机IP

获取网口名称直接输出所有的网口信息ifconfig | grep -v ^ | grep -v ^bashifconfig | awk -F: /^[^ ]/{print$1}ip a | awk -F": " /^[^ ]/{print$2}获取所有的IP直接输出所有的IPifconfig | grep inet | awk {print $2}ip a | awk /inet /{print$2} | sed s#/.*#…

手持移动扫描终端 PDA移动开单系统-批发零售管理

条码数据采集器通过扫描商品条码移动开单,实现便携式办公,伴随式销售,是我公司的一款最新便携式开单配套产品,采集器能通过WIFI无线局域网、GPRS互联网直接与主机连接,让公司业务人员能随时随地了解公司产品信息&#…

sd卡测速工具_拍完照回家发现SD卡损坏,拯救你的照片就用这个办法!

SD卡可以说是目前相机存储的主要工具,一旦拍照结束后出了问题,那可是最头疼的事情。我昨天就碰到了这样奇怪的事情,拍照回来正要导出数据,发现电脑系统提示要格式化存储卡,经过几次插拔发现依然不能识别。如果按照提示…

ELK Stack (1) —— ELK + Redis安装

ELK Stack (1) —— ELK Redis安装 摘要 安装Elasticsearch、Logstash、Kibana与Redis以实现一个日志收集平台 版本 elasticsearch版本: elasticsearch-2.2.0 logstash版本: logstash-2.2.2 kibana版本: kibana-4.3.1-darwin-x64 jdk版本: jdk1.8.0_65 内容 目标架构 Logstash…

智能机器人路径规划及代码_AI割草机器人用ML+传感器自动规划路径

作者:DIGITIMES谢明珊Graze Mowing发表全新自动割草机器人,可针对中大型商用空间提高景观维护效率,吸引来自世界各地的高尔夫球场以及景观维护公司的询问,已累积1,900多万美元预购订单和商业合约,可望为劳力密集的造景…

request.get... getHeader 能取得的信息 参数

转载▼StringTokenizer st new StringTokenizer(agent,";"); st.nextToken(); //得到用户的浏览器名 String userbrowser st.nextToken(); System.out.println(userbrowser); //得到用户的操作系统名 String useros st.nextToken(); System.out.println(useros)…

同一个浏览器打开不同端口的程序登录_【BI报表制作】单点登录与个性化开发...

无法正常登录?想将报表内默认的奥威BI软件logo换成自己家的?想连接Excel数据源做可视化?想实现单点登录(公开分享)?本期的实用课程OurwayBI单点登录与个性化开发可不要错过了。修改端口奥威BI软件默认的端口…

linux使用u盘的过程是,图文详解Linux下使用U盘的方法

习惯了在Windows系统下即插即用U盘,换成Linux系统下你可能就不会使用了。为什么这么说呢?因为Linux系统U盘被视为SCSI设备,因此不能直接使用,还需要我们手动进行相应的设置,下面这篇教程就专门为第一次在Linux下使用U盘的朋友们而…

打印机怎么扫描到电脑_【柯美C360扫描怎么用教程】打印机怎么扫描

【C360扫描怎么用教程】打印机怎么扫描各个品牌的复印机的扫描功能使用方法大同小异,主要步骤就是将扫描原件放置好,选择单面或双面、文件类型、清晰度等,然后按开始就可以扫描了,下面广州柯镁办公设备以柯尼卡美能达复印机C360/C…

自己做站点(一) 从头至尾实现一个企业站的速成

网上随便搜一下。就会发现“xx天学会站点设计”的教程数不胜数,这就说明站点开发并不像非常多人觉得的那么难,从今天開始跟大家一起完毕一个企业站的搭建以及域名申请以及上线的所有过程,希望对大家有所帮助。终于的效果如这个站点所看到的。…

代码证年检所需资料_上海注销小规模公司所需材料及流程

大多数企业分类为:一般人和小规模。公司经营当中如果遇到问题,不再经营的时候,可选择注销。但是,一般人公司注销和小规模注销又有些许的不同。申与城企业擅长各种公司注销。今天就和大家聊一聊新小规模公司注销流程,以…

Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持。 本篇内容 1. python模拟登录淘宝网页 2. 获取登录用户的所有订单详情…

python逻辑流程图_python-程序流程图

原博文 2020-06-03 12:24 − 程序流程图 1、流程图的基本要素: 表示相应操作的框 带箭头的流程线 框内外必要的文字说明 起止框 判断...01055 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言,是一种面向对象的动态类型语言…

linux差分包升级流程,OTA 差分升级包的制作

OTA 升级是 Android 系统提供的标准软件升级方式。 它功能强大,提供了完全升级、增量升级模式,可以通过 SD卡升级,也可以通过网络升级。那如何生成差分升级包呢?Android源码的根目录下有以下两个命令:1、make ——会生…

wps for linux alpha 15 语言包,WPS Office for Linux Alpah 7发布

WPS Office for Linux A7终于出来了,想当年做了一个ppt给老大发过去,后来发现没人能打开。。。先不看功能上的改进,光bug就修复了将近3千条,可见wps4linux团队的付出。版本摘要:增加et组建和主干同步至10月15日和v9分支…

50 个 Bootstrap 插件

Bootstrap是快速开发Web应用程序的前端工具包。它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等。 本文向你推荐 50 个 Bootstrap 的插件…

python能和c语音交互吗_Python和C语言交互--ctypes,struct

python和c语言进行数据交互,涉及类型转换,字节对齐,字节序大小端转换等。相关模块ctypes,struct,memoryview。 一.ctypes:python和c语言使用结构体数据进行交互 场景:有一个C语言生成的动态链接库&#xff…

python3获取网页内容_python3获取一个网页特定内容

我们今天要爬取的网址为:https://www.zhiliti.com.cn/html/luoji/list7_1.html 一、目标:获取下图红色部分内容即获取所有的题目以及答案。 二、实现步骤。 分析: 1,首先查看该网站的结构。分析网页后可以得到: 我们需…

Linux64位steam,这下没得玩了! Steam无奈抛弃Linux用户

众所周知,Linux被公认为最安全的操作系统,近日,网络有消息传出Linux发行版Ubuntu确认将从今年下半年的19.10版本开始不再支持传统32位,而仅支持64位,而没有了32位系统的存在,许多游戏将不能支持。据了解&am…

远程主机http协议版本信息泄漏_Web基础之http协议

Http协议介绍HTTP 全称:Hyper Text Transfer Protocol 中文名:超文本传输协议什么是超文本包含有超链接(Link)和各种多媒体元素标记(Markup)的文本。这些超文本文件彼此链接,形成网状(Web),因此又被称为网页(Web Page…