当前位置: 首页 > 专利查询>东北大学专利>正文

一种评估Maven环境中依赖冲突危险级别的方法技术

技术编号:19745001 阅读:19 留言:0更新日期:2018-12-12 04:41
本发明专利技术提出一种评估Maven环境中依赖冲突危险级别的方法,流程包括:步骤1:获取到当前项目中使用的所有第三方依赖,包括直接依赖和间接依赖;步骤2:对当前项目所有直接依赖和间接依赖进行遍历,识别当前项目中出现的所有依赖冲突;步骤3:针对当前项目中的每个依赖冲突进行NoClass危险级别的评估:步骤4:针对项目中的每个依赖冲突进行NoMethod危险级别的评估:步骤5:对评估结果进行封装,向开发者展现评估结果。本发明专利技术不仅可以检测到项目中存在的依赖冲突,而且对依赖冲突的危险等级进行了有效的评估,帮助开发者更清晰地了解项目中存在的依赖冲突的危险性,优先处理高等级的依赖冲突,可以在有限的时间内最大程度的降低软件在运行时的出现xx‑not‑found‑bug的风险。

【技术实现步骤摘要】
一种评估Maven环境中依赖冲突危险级别的方法
本专利技术涉及软件可靠性领域,特别涉及一种评估Maven环境中依赖冲突危险级别的方法。
技术介绍
在软件开发的过程中,经常会使用第三方开源项目进行软件复用来减少开发成本。Apache组织开发维护的Maven是用java编写的开源项目的管理工具。使用maven进行项目开发可以通过xml形式的pom文件导入及管理项目的依赖。但是在Maven的构建环境中,由于同一个开源项目存在多个版本、maven的依赖管理又存在依赖传递机制,经常会导致项目中出现依赖冲突现象,产生软件缺陷。在软件测试不充分的情况下,这种软件缺陷可能会在软件运行的时候产生开发者意想不到的xx-not-found-bug,主要表现形式包括:java.lang.NoClassDefFoundError、java.lang.ClassNotFoundException、java.lang.NoSuchMethodError和java.lang.NoSuchMethodException。Maven本身虽然可以检测依赖冲突,但缺乏有效的机制对依赖冲突进行评估。Java虚拟机中定义的Class格式文件是编译java类文件后产生的字节码,每一个Class文件都对应着唯一一个类或接口的定义信息,java类文件中的属性、方法,以及类中的常量信息,都会被存储在.class文件中。相对于易于程序员读写java文件,class文件的格式被更加严格的定义,更易于被程序分析。目前有asm、Javassist等流行的工具可以在class形式的字节码文件进行操作,进行java类的产生、分析、修改。借助于soot等java优化框架可以分析java程序的内部结构,既能从单个java文件的角度分析每一条java语句,也可以从整个程序的角度分析每个java类,java方法之间的关系。针对于Maven环境中依赖冲突导致的not-found-bug问题,maven并未提供理想的解决方案。检测项目中的依赖冲突现象只能初步帮助开发者避免此类问题。结合程序内部的类和方法的关系对依赖冲突导致xx-not-found-bug的危险性进行评估比简单的侦测可以更进一步地帮助软件开发者避免程序运行时崩溃。
技术实现思路
针对于项目中出现的依赖冲突,本专利技术通过静态分析得到程序运行可能需要加载执行的类和方法,并基于加载执行的可能性对maven环境中的依赖冲突导致的NoClass和NoMethod两种危险分别进行评估分级:使用类之间的引用关系评估NoClass危险级别,使用方法之间的调用关系评估NoMethod危险级别。一种评估Maven环境中依赖冲突危险级别的方法,包括流程如下,其中步骤3与步骤4不分先后顺序:步骤1:获取到当前项目中使用的所有第三方依赖,包括直接依赖和间接依赖;步骤2:对当前项目所有直接依赖和间接依赖进行遍历,识别当前项目中出现的所有依赖冲突;步骤3:针对当前项目中的每个依赖冲突进行NoClass危险级别的评估,包括步骤3.1~步骤3.6:步骤3.1:识别出依赖冲突中用于编译当前项目的一个依赖UsedJar,其余没有用于编译当前项目的多个依赖NotUsedJar构成集合NotUsedJarSet,UsedJar中的类构成集合UsedJarClassSet,NotUsedJar内部的类构成集合NotUsedJarClassSet,如果有某个类存在于NotUsedJarClassSet却不存在于UsedJarClassSet,则将该冲突NoClass的危险级别设置为1;步骤3.2:解析当前项目中所有被使用的jar包,得到当前项目和其第三方依赖中的类集合UsedClassSet;步骤3.3:遍历当前NoClass危险级别为1的依赖冲突,如果有某个类Class存在于NotUsedJarClassSet却不存在于UsedClassSet,则将该类添加到该依赖冲突的ThrownClassSet中,并将该冲突NoClass的危险级别设置为2;步骤3.4:根据类之间的ClassRef关系,建立类关系的有向图ClassGraph,有向图中的节点为类,边的起点和终点为引用类和被引用的类,边的权值全部为1;步骤3.5:解析当前项目,获取当前项目的宿主类集合HostClassSet;步骤3.6:遍历当前NoClass危险级别为2的依赖冲突:基于ClassGraph,每次以依赖冲突的ThrownClassSet中的一个类为起点,使用Dijkstra算法计算ThrownClass到图中其他节点的最短路径距离,如果依赖冲突的ThrownClassSet中的某个类与HostClassSet中的某个类的最短距离小于无穷大,则将该冲突NoClass的危险级别设置为3;所述最短路径距离计算方法流程包括步骤3.6.1~步骤3.6.5:步骤3.6.1:初始时,从ThrownClassSet中选出一个未被计算的类V0,S={V0},T=V-S={项目中的其他类},T中顶点对应的距离值:若存在<V0,Vi>的有向的类引用,d(V0,Vi)为1,若不存在<V0,Vi>的有向的类引用,d(V0,Vi)为∞。步骤3.6.2:从T中选取一个与S中节点有关联边且权值最小的顶点W,加入到S中。步骤3.6.3:对其余T中节点的距离值进行修改:若加进W作中间节点,从V0到Vi的距离值缩短,则修改此距离值。步骤3.6.4:重复上述步骤3.6.2和3.6.3,直到S中包含所有顶点,即W=Vi为止。步骤3.6.5:重复上述步骤3.6.1~3.6.4,直到ThrownClassSet中的所有类到图中其他节点的最短距离都计算完毕。步骤4:针对项目中的每个依赖冲突进行NoMethod危险级别的评估,包括步骤4.1~步骤4.3:步骤4.1:遍历每个依赖冲突,识别出冲突中用于编译当前项目的一个依赖UsedJar,其余没有用于编译当前项目的多个依赖NotUsedJar构成集合NotUsedJarSet,分析UsedJar得到jar包中的类UsedJarClassSet,以及每个类包含的方法Method,再分析每个NotUsedJar得到jar包中的类集合NotUsedJarClassSet,以及每个类包含的方法Method,如果存在某个方法Method的类名既存在于UsedJarClassSet又存在于NotUsedJarClassSet,但是只有NotUsedJar中的类对该方法有实现,则将该方法加入到对应NotUsedJar的ThrownMethodSet中,并将对应的依赖冲突NoMethod的危险级别设置为1。步骤4.2:遍历每个NoMethod危险级别为1的依赖冲突,对于依赖冲突中的每个NotUsedJar的ThrownMethodSet中的元素ThrownMethod,从ThrownMethod的方法名MethodName中提取类名ClassName,在UsedJar中名为ClassName类为ClassA,如果ClassA的父类依然不存在对ThrownMethod的实现,则将对应的依赖冲突NoMethod的危险级别设置为2。步骤4.3:遍历每个本文档来自技高网
...

【技术保护点】
1.一种评估Maven环境中依赖冲突危险级别的方法,其特征在于,包括流程如下,其中步骤3与步骤4不分先后顺序:步骤1:获取到当前项目中使用的所有第三方依赖,包括直接依赖和间接依赖;步骤2:对当前项目所有直接依赖和间接依赖进行遍历,识别当前项目中出现的所有依赖冲突;步骤3:针对当前项目中的每个依赖冲突进行NoClass危险级别的评估;步骤4:针对项目中的每个依赖冲突进行NoMethod危险级别的评估;步骤5:对评估结果进行封装,向开发者展现评估结果。

【技术特征摘要】
1.一种评估Maven环境中依赖冲突危险级别的方法,其特征在于,包括流程如下,其中步骤3与步骤4不分先后顺序:步骤1:获取到当前项目中使用的所有第三方依赖,包括直接依赖和间接依赖;步骤2:对当前项目所有直接依赖和间接依赖进行遍历,识别当前项目中出现的所有依赖冲突;步骤3:针对当前项目中的每个依赖冲突进行NoClass危险级别的评估;步骤4:针对项目中的每个依赖冲突进行NoMethod危险级别的评估;步骤5:对评估结果进行封装,向开发者展现评估结果。2.根据权利要求1所述一种评估Maven环境中依赖冲突危险级别的方法,其特征在于,所述进行NoClass危险级别的评估,流程包括步骤3.1~步骤3.6:步骤3.1:识别出依赖冲突中用于编译当前项目的一个依赖UsedJar,其余没有用于编译当前项目的多个依赖NotUsedJar构成集合NotUsedJarSet,UsedJar中的类构成集合UsedJarClassSet,NotUsedJar内部的类构成集合NotUsedJarClassSet,如果有某个类存在于NotUsedJarClassSet却不存在于UsedJarClassSet,则将该冲突NoClass的危险级别设置为1;步骤3.2:解析当前项目中所有被使用的jar包,得到当前项目和其第三方依赖中的类集合UsedClassSet;步骤3.3:遍历当前NoClass危险级别为1的依赖冲突,如果有某个类Class存在于NotUsedJarClassSet却不存在于UsedClassSet,则将该类添加到该依赖冲突的ThrownClassSet中,并将该冲突NoClass的危险级别设置为2;步骤3.4:根据类之间的ClassRef关系,建立类关系的有向图ClassGraph,有向图中的节点为类,边的起点和终点为引用类和被引用的类,边的权值全部为1;步骤3.5:解析当前项目,获取当前项目的宿主类集合HostClassSet;步骤3.6:遍历当前NoClass危险级别为2的依赖冲突:基于ClassGraph,每次以依赖冲突的ThrownClassSet中的一个类为起点,使用Dijkstra算法计算ThrownClass到图中其他节点的最短路径距离,如果依赖冲突的ThrownClassSet中的某个类与HostClassSet中的某个类的最短距离小于无穷大,则将该冲突NoClass的危险级别设置为3。3.根据权利要求1所述一种评估Maven环境中依赖冲突危险级别的方法,其特征在于,所述进行NoMethod危险级别的评估,流程包括步骤4.1~步骤4.3:步骤4.1:遍历每个依赖冲突,识别出冲突中用于编译当前项目的一个依赖UsedJar,其余没有用于编译当前项目的多个依赖NotUsedJar构成集合NotUsedJarSet,分析UsedJ...

【专利技术属性】
技术研发人员:刘振伟王蕊杨博王莹于海朱志良
申请(专利权)人:东北大学
类型:发明
国别省市:辽宁,21

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1