【背景】

之前在领英上读到一篇软文,《Managing Software Dependency at Scale》,讲述了领英是如何处理模块之间的依赖解析,以及如何去更好的处理依赖关系以及依赖管理。感觉在一家多产品的公司,在产品有可能相互依赖的情况下,都应该有这么一套系统,来进行依赖关系的管理以及维护。

所以,花费了一天的时间在GitHub上都没有找到可以正常运行的项目之后,决定参照上面的几个现有的实现方式,自己实现一套。

【思考】

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

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

    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

Maven依赖管理系统的更多相关文章

  1. Java开发小技巧(二):自定义Maven依赖

    前言 我们在项目开发中经常会将一些通用的类.方法等内容进行打包,打造成我们自己的开发工具包,作为各个项目的依赖来使用. 一般的做法是将项目导出成Jar包,然后在其它项目中将其导入,看起来很轻松,但是存 ...

  2. Maven依赖版本冲突的分析及解决小结

    1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...

  3. 解决maven依赖传递中的版本冲突问题

    通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具.在使用maven进行项目依赖管理的时候,有时候 ...

  4. 160929、各数据库连接配置与maven依赖安装

    最近做的项目都是maven的,据说maven是个东西.把依赖的jar文件的事情都委托出去辣!试着用了一下哈,效果还可以! 今天做了数据库配置这一块,特意把相关的东西总结出来,以备不时之需. MySQL ...

  5. Maven依赖(转)

    相同依赖级别,先加入的先依赖不同依赖级别,级别短的先依赖 version-->SNAPSHOTxxx-里程碑-->SNAPSHOT,alpha,beta,Release(RC),GA()s ...

  6. maven依赖的全局排除

    今天遇到要全局排除一个maven依赖,因为Maven本身没有全局排除依赖的办法, 参考了同事人英写的一篇博文(可以看这里http://my.oschina.net/liuyongpo/blog/177 ...

  7. maven依赖传递关系

    一.maven 依赖传递规则 举个例子,比如A依赖B,B依赖C,那么A也是依赖C的.A是对B的直接依赖,A对C是传递依赖 ①.最短路劲原则 如,路劲一:A依赖B,B依赖C,C依赖D(1.0.0): 路 ...

  8. Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理

    原文链接: Spring Security with Maven原文日期: 2013年04月24日翻译日期: 2014年06月29日翻译人员: 铁锚 1. 概述 本文通过实例为您介绍怎样使用 Mave ...

  9. Maven依赖解析

    本文将记录Maven工程中依赖解析机制,内容包括: Maven依赖基本结构 从仓库解析依赖的机制 依赖传递性解析实例 1. Maven依赖基本结构 上篇文章记录了Maven依赖的聚合与继承,POM中依 ...

随机推荐

  1. Matlab2016b安装流程

    来源:https://jingyan.baidu.com/article/59703552da12ab8fc007402b.html Matlab2016b安装教程 听语音 原创 | 浏览:34338 ...

  2. docker-管理容器常用命令

    1. docker-管理容器常用命令 2. docker管理容器常用命令 1)  docker ps 显示当前正在运行的容器 [root@test-1 ~]# docker ps CONTAINER ...

  3. 警惕char类型直接相加

    今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串1:12345,字符串2:23456.需要1和2相加.2和3相加.就是两个字符相同位置的数进行相加. 这个一看很好完成,写一个for,然后取 ...

  4. linux块设备驱动---概念与框架(转)

    基本概念   块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性 ...

  5. 2016-12-04---tiny412平台下的iconv库的移植问题

    一.解决问题    在arm开发板上使用framebuff,在汉字显示时,因为只有gb2312的16*16的汉字字库,而ubuntu16.04默认    的编码方式时utf-8,因此需要进行转码(ut ...

  6. CSS精灵图与字体图标

    CSS精灵图与字体图标 1. 精灵图 当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户.然而,一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多 ...

  7. JVM 第六篇:极致优化 IDEA 启动速度

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 引言 相信做 Java 开发的同学,对 IDEA 这个工具应该都不陌生,即使不使用 IDEA 做开发,那么对 Eclipse 这个工具应该 ...

  8. h5的第一份翻译

    <!DOCTYPE html>DOCTYPE DOC文本文档documentTYPE 类型html hyper超,超级的:text文本:markup标记:language语言<htm ...

  9. 【C语言程序设计】小游戏之俄罗斯方块(二)!适合初学者上手、练手!

    第二篇,主要实现俄罗斯方块中的主体部分,包括容器的数据结构以及容器的相关操作,特别是大方块和容器之间的交互逻辑,包括碰撞检测,消除检测等等. 1. 容器的表示 大方块的实现涉及到位运算,而容器同样如此 ...

  10. 飞翔---------双重线性dp

    题目: 鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧.于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中. 这些鹰的起始点被设在一个N*M矩阵的左下 ...