CN110618931A - 依赖关系检测方法、装置、计算机设备及可读存储介质 - Google Patents

依赖关系检测方法、装置、计算机设备及可读存储介质 Download PDF

Info

Publication number
CN110618931A
CN110618931A CN201910750617.8A CN201910750617A CN110618931A CN 110618931 A CN110618931 A CN 110618931A CN 201910750617 A CN201910750617 A CN 201910750617A CN 110618931 A CN110618931 A CN 110618931A
Authority
CN
China
Prior art keywords
dependency
project
external
file
java
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201910750617.8A
Other languages
English (en)
Other versions
CN110618931B (zh
Inventor
董国超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chongqing Financial Assets Exchange LLC
Original Assignee
Chongqing Financial Assets Exchange LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Chongqing Financial Assets Exchange LLC filed Critical Chongqing Financial Assets Exchange LLC
Priority to CN201910750617.8A priority Critical patent/CN110618931B/zh
Publication of CN110618931A publication Critical patent/CN110618931A/zh
Application granted granted Critical
Publication of CN110618931B publication Critical patent/CN110618931B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提出了一种依赖关系检测方法、装置、计算机设备及可读存储介质,依赖关系检测方法,先通过扫描磁盘文件得到Java项目中的所有内部依赖关系,然后在扫描import语句以得到所有依赖关系的同时或之后,将所有内部依赖关系进行剔除,得到Java项目中的所有外部依赖关系,并将所有外部依赖关系以树形结构形式进行输出。整个项目外部依赖关系检测过程十分简便,且在检测时保证了项目内部依赖关系的完全剔除,使用户能够完整掌握Java项目的所有外部依赖关系,从而减少人工代码评审的工作量,提升工作效率,同时给安全部门提供进行安全评估的工具,能够及时发现不稳定因素,使整个软件工程在开发过程中更加安全可控。

Description

依赖关系检测方法、装置、计算机设备及可读存储介质
技术领域
本发明涉及到代码管理领域,特别是涉及到一种依赖关系检测方法、装置、计算机设备及可读存储介质。
背景技术
目前市面上还没有针对软件工程的依赖情况进行自动统计的方案或产品,一般都要依靠操作人员进行手动点击或者逐级查找才能确定引用项目中相关的依赖关系。例如在通过Maven或者Gradle构建的Java项目中,一般可以是通过命令名称查找、dependencies执行工具查或在官方仓库服务器中进行搜索查找。又例如在通过Go语言构建的项目中,可以通过包管理工具glide对代码进行扫描依赖关系,然后在vendor机制下对存在的依赖关系进行解析和查找。但是以上方法都存在着操作步骤比较繁琐,而且缺乏统一管理,无法对依赖关系进行自动统计以及不能够进行跨平台、跨语言操作的缺点。
发明内容
本发明的目的为提供一种依赖关系检测方法,提高项目依赖关系的检测效率,使整个软件工程在开发过程中更加安全可控。
一种依赖关系检测方法,包括:
扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;
扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;
以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;
将所有外部依赖关系以树形结构形式进行输出。
进一步地,扫描磁盘中特定Java项目所有项目文件之间的文件夹引用关系,以得出特定Java项目的所有内部依赖关系的步骤,包括:
检测项目文件的具体文件格式,并根据具体文件格式到预设扫描规则列表中查找对应的具体扫描规则;在预设扫描规则列表中,不同的具体文件格式对应不同的具体扫描规则;
根据具体扫描规则对项目文件进行扫描,以得出Java项目的所有内部依赖关系,扫描磁盘中Java项目所有项目文件时,将项目文件中的起始行代码作为内部依赖关系的起点,然后遍历得出项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出,以得出Java项目的所有内部依赖关系。
进一步地,遍历得出项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出的步骤,包括:
获取项目文件中所有的文件夹节点或者包路径节点,并根据文件夹节点或包路径节点的字符串的ascii码进行排序,形成节点队列;
按照节点队列的排序,逐个选取文件夹节点或包路径节点作为引用起点进行遍历,得出文件夹引用关系;
以树形结构逻辑进行遍历时,实时检测文件夹引用关系中每个文件夹节点或包路径节点的出现次数;
若同一文件夹节点或包路径节点出现的次数大于等于两次,则判定该文件夹节点或包路径节点在Java项目中形成了循环依赖关系,并将循环依赖关系进行剔除。
进一步地,在将所有外部依赖关系以树形结构形式进行输出的步骤之后,还包括:
根据外部依赖关系,对Java项目中引用的所有外部文件包分别进行第一文件包hash值计算,第一文件包hash值由对外部文件包的包含内容进行hash计算得到;
以第一文件包hash值代替外部依赖关系中的外部文件包名称,以第一文件包hash值的形式对外部依赖关系进行描述表示。
进一步地,根据外部依赖关系,对Java项目中引用的所有外部文件包分别进行第一文件包hash值计算的步骤,包括:
在以树形结构表示的外部依赖关系中选定一个节点,按照树形结构展开逐个节点获取Java项目中引用的外部文件包;
采用MD5或SHA-1对外部文件包进行hash计算,得到第一文件包hash值;
重复以上步骤,直至遍历所有节点,停止获取外部文件包。
进一步地,在将所有外部依赖关系以树形结构形式进行输出的步骤之后,还包括:
根据外部依赖关系,扫描所有外部文件包在Java项目中的文件引用关系,得到Java项目在外部文件包中直接引用的特定class文件,并将文件引用关系添加到外部依赖关系中,以树形结构形式进行输出,得到Java项目的外部文件依赖关系;
根据外部文件依赖关系,采用默克尔树算法分别计算出特定class文件的文件hash值、外部文件包的第二文件包hash值以及Java项目的项目hash值,并以默克尔树的形式进行输出。
进一步地,在扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系的步骤之前,还包括:
实时与代码仓库进行同步,获得Java项目中的所有构建代码,构建代码包括import语句;构建代码通过git、svn或者文件方式存储于代码仓库中。
本申请还提出了一种依赖关系检测装置,包括:
第一扫描模块,用于扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;
第二扫描模块,用于扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;
剔除模块,用于在第二扫描模块扫描import语句同时或之后,以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;
输出模块,用于将所有外部依赖关系以树形结构形式进行输出。
本申请还提出了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,其特征在于,处理器执行计算机程序时实现上述中任一项方法的步骤。
本申请还提出了一种可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述中任一项的方法的步骤。
本发明与现有技术相比,有益效果是:本发明提出了一种依赖关系检测方法,包括:扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;将所有外部依赖关系以树形结构形式进行输出。整个项目外部依赖关系检测过程十分简便,且在检测时保证了项目内部依赖关系的完全剔除,使用户能够完整掌握Java项目的所有外部依赖关系,从而减少人工代码评审的工作量,提升工作效率,同时给安全部门提供进行安全评估的工具,能够及时发现不稳定因素,使整个软件工程在开发过程中更加安全可控。
附图说明
图1为本发明一实施例的依赖关系检测方法的步骤示意图;
图2为本发明一实施例的依赖关系检测方法中剔除循环依赖的示意图;
图3为本发明一实施例的依赖关系检测方法中以默克尔树形式输出外部依赖关系的示意图;
图4为本发明一实施例的依赖关系检测装置的模块示意图;
图5为本发明一实施例的计算机设备的模块示意框图;
图6为本发明一实施例的可读存储介质的模块示意框图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明,本发明实施例中所有方向性指示(诸如上、下、左、右、前、后……)仅用于解释在某一特定姿态(如附图所示)下各部件之间的相对位置关系、运动情况等,如果该特定姿态发生改变时,则该方向性指示也相应地随之改变,所述的连接可以是直接连接,也可以是间接连接。
另外,在本发明中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。
参照图1,本申请提出了一种依赖关系检测方法,主要包括以下步骤:
S1:扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;
S2:扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;
S3:以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;
S4:将所有外部依赖关系以树形结构形式进行输出。
在上述步骤实施时,在Java项目中,依赖关系包括了内部依赖关系和外部依赖关系,其中内部依赖表示项目内部中的一个文件依赖项目内部中的另一个文件,而外部依赖则表示的是项目内部中的一个文件依赖项目外的另一个文件,比如,在项目中引入Apache公司的http组件,作为网络通信组件;在项目中引入Google公司的GSON组件,作为Json格式解析的工具。
在一个项目中直接引用的外部依赖可能超过上百个,但是在使用外部依赖加快开发速度的同时,外部依赖的安全漏洞会渗透到开发的工程中。目前大量的安全事故都是由于引入的存在安全漏洞的组件引起的。因此在进行依赖关系检测的过程中,由于内部依赖较为稳定,安全性较高,因此只需针对项目的外部依赖关系进行检测管理即可。
首先,Java项目工程的所有项目构建文件都是存储在磁盘上,即磁盘上的项目构建文件中即包含了该项目存在的所有内部依赖关系,而在使用外部依赖关系的时候,Java项目采用的是从互联网端下载jar包(Java Archive File,Java档案文件)并解压使用的形式,jar包只有在项目运行时才存储在运行内存中或者从运行内存中映射到磁盘上进行使用,所以在Java项目的外部依赖关系不会存在于磁盘的项目构建文件中,具体地,Java项目的内部依赖关系是以文件的形式存在的,具有物理引用关系,而外部依赖关系是以引用节点的形式存在的,具有逻辑引用关系。
因此扫描磁盘中Java项目所有项目文件的文件夹引用关系,具体地,在Java项目中依赖的都是整个文件夹,因此只需扫描文件夹引用关系即可,而无需扫描文件引用关系,就可以得出Java项目的所有内部依赖关系,同时排除了项目外部依赖关系的存在,进一步地,为了保证扫描得到的都是内部依赖关系,在一个具体的实施例中,选择在Java项目运行之前的特定时间段,即在项目引入外部依赖之前,对磁盘中Java项目所有项目文件的文件夹引用关系进行扫描。
然后,由于目前Java文件引入其他文件进行依赖的方式都是通过import语句,因此通过扫描Java项目中的所有import语句,得到Java项目的所有依赖关系,通过扫描import语句得到的依赖关系就包括了内部依赖关系与外部依赖关系。
最后,根据前述得出的Java项目中的所有依赖关系和所有的内部依赖关系,以扫描出的所有内部依赖关系作为剔除参照参数,将所有依赖关系中的所有内部依赖关系进行剔除,得到了Java项目中的所有外部依赖关系,并将所有外部依赖关系以树形结构形式进行输出存储,便于后续进行检测和管理。
在执行上述剔除内部依赖关系的步骤时,在一个具体的实施例中,先扫描出Java项目的所有依赖关系,最后将步骤S1中得到的所有内部依赖关系作为剔除参照参数,统一剔除所有依赖关系中的内部依赖关系,得出Java项目的所有外部依赖,外部依赖表现为外部文件包与项目之间的引用关系。
在另一个具体的实施例中,在执行步骤S2时,即将步骤S1中得到的所有内部依赖关系作为剔除参照参数,在扫描import语句时,如果扫描到内部依赖关系就即时剔除掉,边扫描边剔除,扫描完所有的import语句之后,也就得出了Java项目的所有外部依赖关系。
在一个较优的实施例中,扫描磁盘中特定Java项目所有项目文件之间的文件夹引用关系,以得出特定Java项目的所有内部依赖关系的步骤S1,包括:
S11:检测项目文件的具体文件格式,并根据具体文件格式到预设扫描规则列表中查找对应的具体扫描规则;在预设扫描规则列表中,不同的具体文件格式对应不同的具体扫描规则;
S12:根据具体扫描规则对项目文件进行扫描,以得出Java项目的所有内部依赖关系,扫描磁盘中Java项目所有项目文件时,将项目文件中的起始行代码作为内部依赖关系的起点,然后遍历得出项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出,以得出Java项目的所有内部依赖关系。
在上述步骤实施时,由于可以通过不同的平台以及不同的语言进行构建Java项目,因此Java项目的项目文件格式多种,不同文件格式的项目文件,其对应的扫描规则也就不同。在一个具体的实施例中:
1)若检测到包含有pom.xml文件,则认为是通过Maven构建的Java项目,其依赖关系信息记录在pom.xml文件中,因而可以通过扫描pom.xml文件获得通过Maven构建的Java项目的所有内部依赖关系;
2)若检测到*.gradle文件,则认为是通过Gradle构建的Java项目,其依赖关系记录在*.gradle文件中,因而可以通过扫描*.gradle文件获得通过Gradle构建的Java项目的所有内部依赖关系;
3)若检测到pom.xml文件,则认为是通过NodeJS(npm)构建的项目,其依赖关系记录在package.json文件中,因而可以通过扫描package.json文件获得通过NodeJS(npm)构建的Java项目的所有内部依赖关系;
4)若检测到Dockerfile文件,则认为是通过Dockerfile构建的docker镜像,其依赖关系记录在Dockerfile中,因而可以通过扫描Dockerfile文件获得通过Dockerfile构建的Java项目的所有内部依赖关系;
5)若检测到*.go文件,则认为是通过go开发的项目,其依赖关系记录在*.go文件中的import"url"中,因而可以通过扫描*.go文件获得通过go构建的Java项目的所有内部依赖关系。
通过对不同具体文件格式的具体扫描规则进行预先配置,即可将通过不同语言以及不同系统平台构建的代码中的所有的内部依赖信息检测出来,达到一个确定内部依赖关系以及方便统一管理的目的。
在Java项目中,无论是内部依赖关系还是外部依赖关系,依赖关系都是以文件夹引用关系作为依赖关系,即引用的都是一个组件,而不是单独引用一个文件。因此在进行依赖关系检测时,只需得知依赖的是哪个文件夹即可,而并不需要具体明确依赖的是文件夹中的具体哪个文件。在Java项目的代码撰写中,根据撰写规范,将名称含有大写字母的节点,识别为“文件”,“类”,;名称不含有大写字母的节点,识别为“文件夹”,“包路径”,其中文件夹引用关系即是指名称不含有大写字母的节点之间的引用关系。
在扫描磁盘中Java项目所有项目文件时,将项目文件中的起始行代码作为内部依赖关系的起点,遍历得出项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出,以得出Java项目的所有内部依赖关系。采用树形结构逻辑进行表示输出,使Java项目的内部依赖关系从属表示更加清晰。
在一个较优的实施例中,遍历得出项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出的步骤S12,包括:
S121:获取项目文件中所有的文件夹节点或者包路径节点,并根据文件夹节点或包路径节点的字符串的ascii码进行排序,形成节点队列;
S122:按照节点队列的排序,逐个选取文件夹节点或包路径节点逐个作为引用起点进行遍历,得出文件夹引用关系;
S123:以树形结构逻辑进行遍历时,实时检测文件夹引用关系中每个文件夹节点或包路径节点的出现次数;
S124:若同一文件夹节点或包路径节点出现的次数大于等于两次,则判定该文件夹节点或包路径节点在Java项目中形成了循环依赖关系,并将循环依赖关系进行剔除。
实施上述步骤时,由于在Java项目中,无论是内部依赖关系还是外部依赖关系,依赖关系都是以文件夹引用关系作为依赖关系,因此只需获取项目文件中所有的文件夹节点或者包路径节点即可,而无需获取项目文件中的文件节点或者类节点。
为了保证得出的文件夹引用关系全面且清晰,获取到项目文件中的所有的文件夹节点或者包路径节点之后,以文件夹节点或包路径节点作为引用起点进行遍历时,需按照一定顺序进行,避免重复获取,在一个具体的实施例中,根据文件夹节点或包路径节点的字符串的ascii码进行排序,得到节点队列,然后按照节点队列中的排序逐个选取文件夹节点或包路径节点作为引用起点进行遍历,得出文件夹引用关系。
参照图2,在按照排序作为引用起点进行遍历时,例如按照①→②→③→④→⑤的顺序进行得出依赖关系,实时检测文件夹引用关系中每个文件夹节点或包路径节点在一个文件夹引用关系中的出现次数,若同一文件夹节点或包路径节点出现的次数大于等于两次,则判定该文件夹节点或包路径节点在Java项目中形成了循环依赖关系,并将循环依赖关系进行剔除。循环依赖指的是两个或者多个组件之间互相存在依赖关系,如图2所示,例如组件A依赖于组件D,组件D依赖于组件B,组件B又依赖于组件A(图2中的英文名称都是表示组件名称、文件夹名称或者文件名称),这种循环依赖关系就形成了一个封闭环形逻辑结构,在进行遍历时就有可能一直在该封闭环形逻辑结构内一直循环,无法停止并得出准确的内部依赖关系。因此在本申请中采用树形结构逻辑进行遍历,当出现循环依赖时,并不会形成封闭环形逻辑结构,而是同一文件夹节点或者包路径节点会多次出现。因此当检测到同一文件夹节点或包路径节点出现的次数大于等于两次,如在步骤⑤中所示,则判定该文件夹节点或包路径节点在Java项目中形成了循环依赖关系,对该循环依赖关系予以剔除,以便能够正确得出项目文件中所有内部依赖关系。
在一个较优的实施例中,在将所有外部依赖关系以树形结构形式进行输出的步骤S4之后,还包括:
S5:根据外部依赖关系,对Java项目中引用的所有外部文件包分别进行第一文件包hash值计算,第一文件包hash值由对外部文件包的包含内容进行hash计算得到;
S6:以第一文件包hash值代替外部依赖关系中的外部文件包名称,以第一文件包hash值的形式对外部依赖关系进行描述表示。
上述步骤实施时,在前述步骤S4中已经得到了Java项目中的所有的外部依赖关系,此时外部依赖关系表现为项目对外部文件包的引用关系,并且采用外部文件包的文件名称进行描述表示,即通过外部依赖关系可以得知Java项目中所有引用的外部文件包及其文件包名称。由于不同的外部文件包的文件名称有可能会相同,或者相同的外部文件包的文件名称有可能发生改变,导致在根据特定文件名称对外部依赖关系中进行查找特定的外部文件包时,有可能会产生误差,无法进行精确查找,甚至有可能因为名称中特殊字符的存在使得查找出现偏差。
因此在得出项目中所有的外部依赖关系后,根据外部依赖关系对项目中引用的所有外部文件包进行第一文件包hash值的一一计算,并以第一文件包hash值代替外部依赖关系中的外部文件包名称,将原本采用外部文件包名称形式进行描述表示的外部依赖关系转变为采用第一文件包hash值的形式进行描述表示。由于第一文件包hash值只与外部文件包的包含内容有关,因此不同的外部文件包,即使文件包名称一致,只要包含内容有所差别,其第一文件包hash值也会有所不同。
采用第一文件包hash值对外部依赖关系进行描述表示后,则可以根据第一文件包hash值对整个项目进行安全检测以及告警。例如,当检测模块查找到某开源项目存在安全漏洞时,可以通过下载该开源项目存在安全漏洞的jar包,然后计算该jar包的文件包hash值,根据该文件包hash值在外部依赖关系中查询是否有应用采用了该开源项目的包,若在外部依赖关系中存在第一文件包hash值等于该文件包hash值,则说明在项目中引用了该jar包,则自动发出告警信息。采用第一文件包hash值进行检测告警,无需对复杂的文件包名称进行一一甄别,查找快速,定位精准,精简了大量计算量。
在一个较优的实施例中,根据外部依赖关系,对Java项目中引用的所有外部文件包分别进行第一文件包hash值计算的步骤S5,包括:
S51:在以树形结构表示的外部依赖关系中选定一个节点,按照树形结构展开逐个节点获取Java项目中引用的外部文件包;
S52:采用MD5或SHA-1对外部文件包进行hash计算,得到第一文件包hash值;
S53:重复以上步骤,直至遍历所有节点,停止获取外部文件包。
实施以上步骤时,在前述步骤中已经得到了以树形结构形式输出的外部依赖关系,此时在以树形结构表示的外部依赖关系中选定一个节点,然后按照树形结构展开逐个节点获取Java项目中引用的外部文件包,以保证能够完整获取到Java项目中的所有外部依赖。
然后采用MD5(Message-Digest Algorithm 5,信息-摘要算法5)或SHA-1(SecureHash Algorithm 1,安全散列算法1)对外部文件包进行hash计算,得到第一文件包hash值;重复以上步骤,直至遍历所有节点,停止获取外部文件包,此时便得到了Java项目中所有引用的外部文件包各自的第一文件包hash值。
参照图3,在一个较优的实施例中,在将所有外部依赖关系以树形结构形式进行输出的步骤S4之后,还包括:
S7:根据外部依赖关系,扫描所有外部文件包在Java项目中的文件引用关系,得到Java项目在外部文件包中直接引用的特定class文件,并将文件引用关系添加到外部依赖关系中,以树形结构形式进行存储输出,得到Java项目的外部文件依赖关系;
S8:根据外部文件依赖关系,采用默克尔树算法分别计算出特定class文件的文件hash值、外部文件包的第二文件包hash值以及Java项目的项目hash值,并以默克尔树的形式进行输出。
上述步骤实施时,在外部依赖关系中,已经得知了Java项目对所有外部文件包的文件夹引用关系,进一步地,根据外部依赖关系扫描所有的外部文件包在Java项目中的文件引用关系,即得到Java项目在外部文件包中直接引用的特定class文件,并将文件引用关系添加到外部依赖关系中,得到外部文件依赖关系,也即是属于对外部依赖关系的进一步细化,将文件夹引用关系具体延伸为文件引用关系。在一个具体的实施例中,一个外部文件包,例如jar包,在Java项目中被引用时表现为一个或多个文件夹的形式,而一个文件夹里边包括了一个或多个文件。Java项目中引用外部文件包,其外部依赖关系实际上引用的就是文件夹,进一步的,引用的时文件夹中的某一个文件。
默克尔树也叫做哈希树,其树形结构的每一个节点都是有哈希值组成。采用默克尔树算法分别计算出特定class文件的文件hash值、外部文件包的第二文件包hash值以及Java项目的项目hash值,在一个具体的实施例中,如图,3所示,文件hash值(hash2、hash4、hash6)由对特定的class文件直接进行hash计算得到;外部文件包的第二文件包hash值(hash5、hash6),由对该外部文件包下包含的文件hash值进行hash计算得到,例如hash5由对hash4进行hash计算得到,hash3由对hash1和hash2进行hash计算得到;Java项目的项目hash值(hash8),由对该Java项目下包含的第二文件包hash值进行hash计算得到,例如,hash8由对hash3、hash5和hash7进行hash计算得到。
采用默克尔树对外部文件依赖关系进行描述之后,当项目引用的外部文件包中的某一个class文件发生改变时,不仅可以根据hash值在Java项目中快速定位出被改变的class文件,还能够检测该外部文件包中的改变内容对于Java项目是否产生影响。当项目hash值(hash8)发生改变时,即可以快速定位出外部文件包中被改变的具体class文件。在一个具体的实施例中,例如被改变的class文件是YYYY.class。如果采用传统遍历的方式,则需要扫描完所有的文件,遍历的次数达到8次才能够定位出被改变的class文件为YYYY.class;若采用默克尔树则只需要遍历发生改变的节点,遍历的次数只需要3次,经hash8→hash7→hash6的检测路径即可直接快速定位出被改变的class文件为YYYY.class,大大减少了遍历次数,节省了检索资源。
在一个较优的实施例中,在扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系的步骤S2之前,还包括:
S01:实时与代码仓库进行同步,获得Java项目中的所有构建代码,构建代码包括import语句;构建代码通过git、svn或者文件方式存储于代码仓库中。
在上述步骤中,构建代码通过git、svn、或者文件等方式存储于代码仓库中。该代码仓库为一个服务器,可使用外部的官方代码仓库服务器进行托管也可以通过外部框架进行自行搭建,将Java项目工程所需要的所有构建代码都保存至代码仓库中,以便查找和搜索,将所有的构建代码存储到代码仓库服务器中也就是将Java项目中的所有依赖关系也都存储到了代码仓库中,代码的存储结果为一个树形结构的文件夹。其中,SVN(Subversion)指的是集中式管理的版本控制器,只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新,获取构建代码的更新,也只能连接到这个唯一的代码仓库服务器中,同步以取得最新数据和其依赖关系。Git指的是分布式管理的版本控制器,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份,通过Git所得到的代码仓库都是平等的,操作人员可以从任何一个代码仓库的克隆来创建个人代码仓库,同时个人代码仓库也可以作为源提供给他人。因此在每个操作人员的客户端中都存储有项目所有的代码以及相应的依赖关系。通过与实时与代码仓库进行同步,保证了扫描得到的所有外部依赖关系都是最新的外部依赖,防止出现外部依赖关系更新不及时或者扫描不完全的情况出现。
本申请提出了一种依赖关系检测方法,包括:S1:扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;S2:扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;S3:在扫描import语句同时或之后,以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;S4:将所有外部依赖关系以树形结构形式进行输出。得到Java项目中的所有内部依赖关系之后,在扫描import语句以得到所有依赖关系的同时或之后,将所有内部依赖关系进行剔除,得到Java项目中的所有外部依赖关系,并将所有外部依赖关系以树形结构形式进行输出存储,整个项目外部依赖关系检测过程十分简便,且在检测时保证了项目内部依赖关系的完全剔除,使用户能够完整掌握Java项目的所有外部依赖关系,从而减少人工代码评审的工作量,提升工作效率,同时给安全部门提供进行安全评估的工具,能够及时发现不稳定因素,使整个软件工程在开发过程中更加安全可控。
参照图4,本申请还提出了一种依赖关系检测装置,包括:
第一扫描模块10,用于扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;
第二扫描模块20,用于扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括内部依赖关系与外部依赖关系;
剔除模块30,用于以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;
输出模块40,用于将所有外部依赖关系以树形结构形式进行输出。
其中上述模块10-40分别用于执行的操作与前述实施方式的依赖关系检测方法的步骤一一对应,在此不再赘述。
进一步地,对应前述实施方式的智能终端管理方法的细分步骤,上述模块10-40相应的包含了子模块、单元或子单元,用于执行前述依赖关系检测方法的细分步骤,在此也不再赘述。
参照图5,本发明还提出了一种计算机设备,包括存储器1003和处理器1002,存储器1003存储有计算机程序1004,,处理器1002执行计算机程序1004时实现上述中任一项方法的步骤,包括:扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;将所有外部依赖关系以树形结构形式进行输出。
参照图6,本发明还提出了一种计算机可读存储介质2001,其上存储有计算机程序2002,,计算机程序2002被处理器执行时实现上述中任一项的方法的步骤,包括:扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出Java项目的所有内部依赖关系;扫描Java项目中的所有import语句,得出import语句中所有的文件夹引用关系,以得到Java项目的所有依赖关系;在import语句中记录了Java项目的所有依赖关系,依赖关系包括Java项目的内部依赖关系与外部依赖关系;以内部依赖关系作为剔除参照参数,对依赖关系中包含的内部依赖关系进行剔除,得到Java项目的所有外部依赖关系;将所有外部依赖关系以树形结构形式进行输出。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (10)

1.一种依赖关系检测方法,其特征在于,包括:
扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出所述Java项目的所有内部依赖关系;
扫描所述Java项目中的所有import语句,得出所述import语句中所有的文件夹引用关系,以得到所述Java项目的所有依赖关系;在所述import语句中记录了所述Java项目的所有所述依赖关系,所述依赖关系包括所述Java项目的所述内部依赖关系与外部依赖关系;
以所述内部依赖关系作为剔除参照参数,对所述依赖关系中包含的所述内部依赖关系进行剔除,得到所述Java项目的所有外部依赖关系;
将所有所述外部依赖关系以树形结构形式进行输出。
2.根据权利要求1所述的依赖关系检测方法,其特征在于,所述扫描磁盘中特定Java项目所有项目文件之间的文件夹引用关系,以得出所述特定Java项目的所有内部依赖关系的步骤,包括:
检测所述项目文件的具体文件格式,并根据所述具体文件格式到预设扫描规则列表中查找对应的具体扫描规则;在所述预设扫描规则列表中,不同的所述具体文件格式对应不同的所述具体扫描规则;
根据所述具体扫描规则对所述项目文件进行扫描,扫描磁盘中所述Java项目所有项目文件时,将所述项目文件中的起始行代码作为所述内部依赖关系的起点,然后遍历得出所述项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出,以得出所述Java项目的所有所述内部依赖关系。
3.根据权利要求2所述的依赖关系检测方法,其特征在于,所述遍历得出所述项目文件的文件夹引用关系,并以树形结构逻辑进行表示输出的步骤,包括:
获取所述项目文件中所有的文件夹节点或者包路径节点,并根据所述文件夹节点或所述包路径节点的字符串的ascii码进行排序,形成节点队列;
按照所述节点队列的排序,逐个选取所述文件夹节点或所述包路径节点作为引用起点进行遍历,得出所述文件夹引用关系;
以树形结构逻辑进行遍历时,实时检测所述文件夹引用关系中每个所述文件夹节点或所述包路径节点的出现次数;
若同一所述文件夹节点或所述包路径节点出现的次数大于等于两次,则判定该所述文件夹节点或所述包路径节点在所述Java项目中形成了循环依赖关系,并将所述循环依赖关系进行剔除。
4.根据权利要求1所述的依赖关系检测方法,其特征在于,在所述将所有所述外部依赖关系以树形结构形式进行输出的步骤之后,还包括:
根据所述外部依赖关系,对所述Java项目中引用的所有外部文件包分别进行第一文件包hash值计算,所述第一文件包hash值由对所述外部文件包的包含内容进行hash计算得到;
以所述第一文件包hash值代替所述外部依赖关系中的外部文件包名称,以所述第一文件包hash值的形式对所述外部依赖关系进行描述表示。
5.根据权利要求4所述的依赖关系检测方法,其特征在于,所述根据所述外部依赖关系,对所述Java项目中引用的所有外部文件包分别进行第一文件包hash值计算的步骤,包括:
在以树形结构表示的所述外部依赖关系中选定一个节点,按照树形结构展开逐个节点获取所述Java项目中引用的所述外部文件包;
采用MD5或SHA-1对所述外部文件包进行hash计算,得到所述第一文件包hash值;
重复以上步骤,直至遍历所有节点,停止获取所述外部文件包。
6.根据权利要求1所述的依赖关系检测方法,其特征在于,在所述将所有所述外部依赖关系以树形结构形式进行输出的步骤之后,还包括:
根据所述外部依赖关系,扫描所有外部文件包在所述Java项目中的文件引用关系,得到所述Java项目在所述外部文件包中直接引用的特定class文件,并将所述文件引用关系添加到所述外部依赖关系中,以树形结构形式进行输出,得到所述Java项目的外部文件依赖关系;
根据所述外部文件依赖关系,采用默克尔树算法分别计算出所述特定class文件的文件hash值、所述外部文件包的第二文件包hash值以及所述Java项目的项目hash值,并以默克尔树的形式进行输出。
7.根据权利要求1所述的依赖关系检测方法,其特征在于,在所述扫描所述Java项目中的所有import语句,得出所述import语句中所有的文件夹引用关系,以得到所述Java项目的所有依赖关系的步骤之前,还包括:
实时与代码仓库进行同步,获得所述Java项目中的所有构建代码,所述构建代码包括所述import语句;所述构建代码通过git、svn或者文件方式存储于所述代码仓库中。
8.一种依赖关系检测装置,其特征在于,包括:
第一扫描模块,用于扫描磁盘中特定Java项目中所有项目文件之间的文件夹引用关系,以得出所述Java项目的所有内部依赖关系;
第二扫描模块,用于扫描所述Java项目中的所有import语句,得出所述import语句中所有的文件夹引用关系,以得到所述Java项目的所有依赖关系;在所述import语句中记录了所述Java项目的所有所述依赖关系,所述依赖关系包括所述Java项目的所述内部依赖关系与外部依赖关系;
剔除模块,用于在所述第二扫描模块扫描所述import语句同时或之后,以所述内部依赖关系作为剔除参照参数,对所述依赖关系中包含的所述内部依赖关系进行剔除,得到所述Java项目的所有外部依赖关系;
输出模块,用于将所有所述外部依赖关系以树形结构形式进行输出。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
CN201910750617.8A 2019-08-14 2019-08-14 依赖关系检测方法、装置、计算机设备及可读存储介质 Active CN110618931B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910750617.8A CN110618931B (zh) 2019-08-14 2019-08-14 依赖关系检测方法、装置、计算机设备及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910750617.8A CN110618931B (zh) 2019-08-14 2019-08-14 依赖关系检测方法、装置、计算机设备及可读存储介质

Publications (2)

Publication Number Publication Date
CN110618931A true CN110618931A (zh) 2019-12-27
CN110618931B CN110618931B (zh) 2024-06-07

Family

ID=68921196

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910750617.8A Active CN110618931B (zh) 2019-08-14 2019-08-14 依赖关系检测方法、装置、计算机设备及可读存储介质

Country Status (1)

Country Link
CN (1) CN110618931B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112115473A (zh) * 2020-09-15 2020-12-22 四川长虹电器股份有限公司 一种用于Java开源组件安全检测的方法
CN112256637A (zh) * 2020-10-19 2021-01-22 贝壳技术有限公司 一种基于抽象语法树的文件管理方法、装置及存储介质
CN112799937A (zh) * 2021-01-13 2021-05-14 东北大学 基于GitHub自动化检测Maven项目中依赖冲突问题的方法
CN112837026A (zh) * 2021-01-22 2021-05-25 山东浪潮通软信息科技有限公司 一种交付物循环依赖的分析方法、装置、设备及存储介质
CN113064814A (zh) * 2021-03-09 2021-07-02 青岛海尔科技有限公司 组件引用数据的处理方法及装置、存储介质及电子装置

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE10065286A1 (de) * 1999-12-29 2001-07-12 Holger Giese Verfahren zum Entwurf und/oder zum Betrieb kombinierbarer Komponenten (TYCS)
US20070162903A1 (en) * 2006-01-06 2007-07-12 Babb Robert G Ii Systems and methods for identifying and displaying dependencies
CN104077140A (zh) * 2014-07-04 2014-10-01 用友软件股份有限公司 用于持续集成的自动化编译方法和编译装置
CN105046155A (zh) * 2015-06-24 2015-11-11 北京系统工程研究所 软件系统漏洞风险评估方法及装置
CN107885501A (zh) * 2017-11-03 2018-04-06 武汉斗鱼网络科技有限公司 获取Android中组件相互引用关系的方法及装置
CN108228229A (zh) * 2016-12-19 2018-06-29 深圳业拓讯通信科技有限公司 一种Maven依赖的管理方法以及系统
CN108763928A (zh) * 2018-05-03 2018-11-06 北京邮电大学 一种开源软件漏洞分析方法、装置和存储介质
CN108984416A (zh) * 2018-08-07 2018-12-11 东北大学 一种评估Maven环境中依赖冲突危险级别的方法
CN109033843A (zh) * 2018-08-02 2018-12-18 南瑞集团有限公司 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CN109189729A (zh) * 2018-09-03 2019-01-11 五八有限公司 各组件间依赖关系的查找方法、装置、设备及存储介质
US20190146762A1 (en) * 2017-11-13 2019-05-16 Bank Of America Corporation Intelligent software compiler dependency fulfillment

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE10065286A1 (de) * 1999-12-29 2001-07-12 Holger Giese Verfahren zum Entwurf und/oder zum Betrieb kombinierbarer Komponenten (TYCS)
US20070162903A1 (en) * 2006-01-06 2007-07-12 Babb Robert G Ii Systems and methods for identifying and displaying dependencies
CN104077140A (zh) * 2014-07-04 2014-10-01 用友软件股份有限公司 用于持续集成的自动化编译方法和编译装置
CN105046155A (zh) * 2015-06-24 2015-11-11 北京系统工程研究所 软件系统漏洞风险评估方法及装置
CN108228229A (zh) * 2016-12-19 2018-06-29 深圳业拓讯通信科技有限公司 一种Maven依赖的管理方法以及系统
CN107885501A (zh) * 2017-11-03 2018-04-06 武汉斗鱼网络科技有限公司 获取Android中组件相互引用关系的方法及装置
US20190146762A1 (en) * 2017-11-13 2019-05-16 Bank Of America Corporation Intelligent software compiler dependency fulfillment
CN108763928A (zh) * 2018-05-03 2018-11-06 北京邮电大学 一种开源软件漏洞分析方法、装置和存储介质
CN109033843A (zh) * 2018-08-02 2018-12-18 南瑞集团有限公司 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CN108984416A (zh) * 2018-08-07 2018-12-11 东北大学 一种评估Maven环境中依赖冲突危险级别的方法
CN109189729A (zh) * 2018-09-03 2019-01-11 五八有限公司 各组件间依赖关系的查找方法、装置、设备及存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
KAMIL JEZEK等: "On the Use of Static Analysis to Safeguard Recursive Dependency Resolution", 2014 40TH EUROMICRO CONFERENCE ON SOFTWARE ENGINEERING AND ADVANCED APPLICATIONS, pages 166 - 173 *
张杨华: "面向Android的第三方库检测技术研究", 中国优秀硕士学位论文全文数据库 信息科技辑, pages 138 - 159 *
韩承锋等: "适用于分布式静态检测的Java代码依赖性分析技术", 计算机系统应用, pages 133 - 139 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112115473A (zh) * 2020-09-15 2020-12-22 四川长虹电器股份有限公司 一种用于Java开源组件安全检测的方法
CN112256637A (zh) * 2020-10-19 2021-01-22 贝壳技术有限公司 一种基于抽象语法树的文件管理方法、装置及存储介质
CN112799937A (zh) * 2021-01-13 2021-05-14 东北大学 基于GitHub自动化检测Maven项目中依赖冲突问题的方法
CN112799937B (zh) * 2021-01-13 2023-09-26 东北大学 基于GitHub自动化检测Maven项目中依赖冲突问题的方法
CN112837026A (zh) * 2021-01-22 2021-05-25 山东浪潮通软信息科技有限公司 一种交付物循环依赖的分析方法、装置、设备及存储介质
CN113064814A (zh) * 2021-03-09 2021-07-02 青岛海尔科技有限公司 组件引用数据的处理方法及装置、存储介质及电子装置

Also Published As

Publication number Publication date
CN110618931B (zh) 2024-06-07

Similar Documents

Publication Publication Date Title
CN110618931A (zh) 依赖关系检测方法、装置、计算机设备及可读存储介质
US11150874B2 (en) API specification generation
US10949178B1 (en) Method and system for decomposing a global application programming interface (API) graph into an application-specific API subgraph
US20190147167A1 (en) Apparatus for collecting vulnerability information and method thereof
CN106155724B (zh) 一种升级方法及装置
CN107885501B (zh) 获取Android中组件相互引用关系的方法及装置
CN110109681B (zh) 不同平台间代码的转换方法及系统
US20200379435A1 (en) Method and electronic generation device for generating at least one configuration file for an automation tool, related computer program
US10146749B2 (en) Tracking JavaScript actions
CN111651196B (zh) 文档发布方法、装置及服务器
CN114579203B (zh) 脚本文件检查方法、装置、电子设备及存储介质
CN113568604B (zh) 风控策略的更新方法、装置及计算机可读存储介质
CN111159142B (zh) 一种数据处理方法及装置
CN112800194B (zh) 一种接口变更识别方法、装置、设备及存储介质
CN116088846A (zh) 一种持续集成代码格式的处理方法、相关装置及设备
CN112434831A (zh) 故障排查方法、装置、存储介质及计算机设备
CN113254040B (zh) 前端框架更新方法、装置、设备及存储介质
CN115291935A (zh) 组件更新方法、组件更新装置、设备和存储介质
CN112799673B (zh) 一种网络协议数据的校核方法及装置
CN111400245B (zh) 美术资源迁移方法及装置
CN113536762A (zh) Json文本的比对方法及装置
CN113515303A (zh) 一种项目转型方法、装置和设备
CN114721658A (zh) 无效依赖检测方法及相关设备
CN113778450A (zh) 依赖冲突的处理方法、装置、设备及存储介质
CN111737504A (zh) 图像资源检测方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant