System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术属于软件维护与演化,特别涉及一种基于静态分析的软件库版本安全替换方法。
技术介绍
1、随着软件的开发规模越来越大,第三方库的出现提高了项目代码的可复用性,软件项目越来越依赖第三方库来实现代码重用。然而,项目对于第三方库的重度依赖也带来了项目依赖库管理方面的困难,即使诸如maven、gradle等项目构建工具将项目的依赖管理过程自动化,能够在项目编译时适当处理依赖关系,减少程序员手动管理依赖的麻烦,但程序员对构建工具依赖处理规则不熟悉时,仍无法避免由于依赖管理问题造成的运行时异常或意外的运行结果。
2、为了应对上述问题,构建工具提供了一些功能提示程序员项目存在多版本依赖库的问题,并提供了一些机制让程序员能够手动指定所需要的依赖版本。比如maven构建工具提供了maven-dependency-plugin,允许程序员打印项目依赖树,并在打印信息中显示依赖库存在的多个版本;maven也允许程序员使用dependencymanagement标签指定所需间接依赖库的版本号,或通过exclusion标签将不想使用的间接依赖库删除。但是,maven构建工具不能得知这些依赖库存在多版本的情况在运行时是否会引发运行时异常,如果不会引发,则无需额外管理;如果会引发,对依赖的手动管理需要程序员具备相当丰富的对所使用的依赖库特性的知识。因此,一种基于静态分析的软件库版本安全替换方法亟待提出。
技术实现思路
1、本专利技术为尽可能减少maven项目可能引发运行时异常的依赖库存在多版本
2、为实现上述目的,本专利技术采用以下技术方案:
3、一种基于静态分析的软件库版本安全替换方法,其特征在于,包括以下步骤:
4、采用maven相关开源工具,获取maven项目依赖树,然后遍历依赖树,确定在依赖树中存在多版本的依赖库,并计算这些存在多版本的依赖库各自的被舍弃版本和被保留版本的集合差异,所述集合差异包括类集合差异和方法集合差异;
5、若集合差异不为空,采用静态分析方式,分析集合差异是否可以被maven项目中的类和方法通过路径引用到,若可以,则启动库版本替换过程,替换maven项目引用的依赖库的版本号,直至maven项目不再存在集合差异可能被引用的情况。
6、为优化上述技术方案,采取的具体措施还包括:
7、进一步地,所述采用maven相关开源工具,获取maven项目依赖树,具体为:
8、通过maven官方提供的相关api,构建maven项目依赖树。
9、进一步地,所述遍历依赖树,确定在依赖树中存在多版本的依赖库,并计算这些存在多版本的依赖库各自的被舍弃版本和被保留版本的集合差异,具体为:
10、遍历整棵依赖树,寻找出现了多个版本的第三方库,并根据依赖树自身携带的信息确定哪一个版本是被保留的,哪些版本是被舍弃的;
11、计算被保留版本的集合以及各个被舍弃版本的集合,用被舍弃版本的集合与被保留版本的集合做差,以得到各个被舍弃版本与被保留版本的集合差异。
12、进一步地,所述分析集合差异是否可能被maven项目中的类和方法通过路径引用到,具体为:
13、选取依赖树中相关jar包,计算调用图,并在图上以maven项目为起始节点,以集合差异为目标节点,分析起始节点到目标节点的可达性。
14、进一步地,所述选取依赖树中相关jar包,计算调用图,具体为:
15、不选取整颗依赖树的jar包,只计算依赖树根节点到被舍弃版本链路上的jar包调用图。
16、进一步地,所述计算调用图之前,先利用类引用关系预判不可达的方法集合差异,排除掉一定不会被调用到的方法,免去其调用图计算过程。
17、进一步地,所述库版本替换过程采用如下的替换方法:
18、替换依赖库被保留版本,使得被保留版本集合包含原本的集合差异,集合差异中的所有方法和类都会在运行时被保留和加载;
19、或者,切断对集合差异的调用链路,替换依赖树中被舍弃版本父节点所属依赖库的版本号,使得maven项目在运行时不会再试图引用集合差异中的方法和类。
20、进一步地,所述库版本替换过程结束后,采用如下方式验证替换结果的有效性:
21、执行maven项目构建过程,保证替换后maven项目能被正常编译,若不能正常编译,证明替换策略无效,尝试其他版本进行替换;
22、检查替换后集合差异是否消失:若集合差异消失,则判定为替换策略有效;若集合差异存在,采用静态程序分析工具,验证集合差异是否可以被maven项目引用到,若可以,尝试其他版本进行替换;
23、验证替换后依赖库是否存在多版本,并验证依赖库被舍弃版本和被保留版本的集合差异是否可以被maven项目引用到,若可以,尝试其他版本进行替换。
24、进一步地,所述尝试其他版本进行替换的过程中,采用如下方式确认版本搜索空间:
25、以当前maven项目使用版本为基准,分别在以下三种版本中依次各选取1至2个版本用于候选替换版本集合,其中,第一种版本是与当前maven项目使用版本major号、minor号相同但patch号不同的版本,第二种版本是与当前maven项目使用版本major号相同但minor号不同的版本,第三种版本是与当前maven项目使用版本major号不同的版本。
26、进一步地,所述尝试其他版本进行替换的过程中,采用如下方式确认版本搜索空间:
27、预先建立一个es数据库,其中存储maven官方仓库中每一个jar包的直接依赖列表;在es数据库中,通过倒排索引进行查询,确定替换版本。
28、本专利技术的有益效果是:本专利技术提供的一种基于静态分析的软件库版本安全替换方法,采用保守的静态分析方式,自动分析项目多版本依赖库中被舍弃版本方法/类可能被项目调用到的风险,并在分析出可能风险的基础上,自动尝试帮助项目开发者选择和推荐更合理和适用性更强的项目使用依赖库版本,同时兼顾了使用效率。本专利技术既可以有效减少maven项目可能引发运行时异常的依赖库存在多版本问题,还可以保证在解决原依赖库多版本问题后不引入新的可能引发运行异常的依赖库多版本问题,能够有效发现并解决maven项目由于依赖库存在多版本问题造成的运行时异常。
本文档来自技高网...【技术保护点】
1.一种基于静态分析的软件库版本安全替换方法,其特征在于,包括以下步骤:
2.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述采用Maven相关开源工具,获取Maven项目依赖树,具体为:
3.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述遍历依赖树,确定在依赖树中存在多版本的依赖库,并计算这些存在多版本的依赖库各自的被舍弃版本和被保留版本的集合差异,具体为:
4.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述分析集合差异是否可以被Maven项目中的类和方法通过路径引用到,具体为:
5.如权利要求4所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述选取依赖树中相关Jar包,计算调用图,具体为:
6.如权利要求4所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述计算调用图之前,先利用类引用关系预判不可达的方法集合差异,排除掉一定不会被调用到的方法,免去其调用图计算过程。
7.如权利要求1所述的一种
8.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述库版本替换过程结束后,采用如下方式验证替换结果的有效性:
9.如权利要求8所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述尝试其他版本进行替换的过程中,采用如下方式确认版本搜索空间:
10.如权利要求8所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述尝试其他版本进行替换的过程中,采用如下方式确认版本搜索空间:
...【技术特征摘要】
1.一种基于静态分析的软件库版本安全替换方法,其特征在于,包括以下步骤:
2.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述采用maven相关开源工具,获取maven项目依赖树,具体为:
3.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述遍历依赖树,确定在依赖树中存在多版本的依赖库,并计算这些存在多版本的依赖库各自的被舍弃版本和被保留版本的集合差异,具体为:
4.如权利要求1所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述分析集合差异是否可以被maven项目中的类和方法通过路径引用到,具体为:
5.如权利要求4所述的一种基于静态分析的软件库版本安全替换方法,其特征在于:所述选取依赖树中相关jar包,计算调用图,具体为:
6.如权...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。