CN111190641B - 基于API分析的Java第三方库版本统一推荐方法 - Google Patents

基于API分析的Java第三方库版本统一推荐方法 Download PDF

Info

Publication number
CN111190641B
CN111190641B CN202010077124.5A CN202010077124A CN111190641B CN 111190641 B CN111190641 B CN 111190641B CN 202010077124 A CN202010077124 A CN 202010077124A CN 111190641 B CN111190641 B CN 111190641B
Authority
CN
China
Prior art keywords
party library
version
versions
party
module
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.)
Active
Application number
CN202010077124.5A
Other languages
English (en)
Other versions
CN111190641A (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.)
Fudan University
Original Assignee
Fudan University
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 Fudan University filed Critical Fudan University
Priority to CN202010077124.5A priority Critical patent/CN111190641B/zh
Publication of CN111190641A publication Critical patent/CN111190641A/zh
Application granted granted Critical
Publication of CN111190641B publication Critical patent/CN111190641B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本发明属于软件工程技术领域,具体为基于API分析的Java第三方库版本统一推荐方法。本发明方法包括,分析Java软件项目各个模块的第三方库依赖继承关系,获得软件项目各个模块所依赖的Java第三方库版本;检测软件项目中的Java第三方库版本不一致问题,识别同一个Java第三方库的不同版本在软件项目不同模块中被使用的问题;通过基于API调用图差异分析的Java第三方库版本统一代价分析,推荐Java第三方库的统一版本并量化统一到该Java第三方库版本的维护代价。本发明方法可以帮助开发人员及时统一第三方库版本,减少开发人员的第三方库版本统一工作量和软件项目中第三方库的长期维护代价。

Description

基于API分析的Java第三方库版本统一推荐方法
技术领域
本发明属于软件工程技术领域,具体涉及一种基于API分析的Java第三方库版本统一推荐方法。
背景技术
随着软件项目多样性和复杂性的不断增长,模块化软件开发已经成为了一种鼓励复用、提高可维护性、以及支持高效协作开发的常用实践。因此,Java自动化构建工具(例如Maven)提供了许多机制来支持Java多模块软件项目的开发和构建管理。其中一种机制就是允许Java软件项目的各个模块单独声明第三方库依赖。在便于多模块软件开发的同时,这种机制给软件开发过程中的第三方库依赖管理带来了极大的挑战。
其中一个问题是,Java软件项目的不同模块声明了对同一个第三方库的依赖,但是使用了该第三方库的不同版本。一方面,这种第三方库版本不一致问题极大地增加了开发人员维护第三方库的代价,甚至会引起第三方库冲突并导致运行时错误。另一方面,Java自动化构建工具提供了灵活的机制来声明第三方库依赖,例如允许一个模块声明自己的第三方库依赖、允许一个模块继承另一个模块的第三方库依赖、允许通过硬编码来声明第三方库版本号、允许通过变量引用来声明第三方库版本号等。这些灵活的第三方库依赖声明机制使得第三方库版本不一致问题的检测变得困难。
发明内容
本发明的目的在于提供一种基于API分析的Java第三方库版本统一推荐方法,以帮助开发人员及时检测到Java软件项目中的第三方库版本不一致问题,同时推荐并量化统一到第三方库一致版本的维护代价,从而帮助开发人员及时统一第三方库版本并减少维护工作量。
本发明提供的基于API分析的Java第三方库版本统一推荐方法,具体步骤如下:
(1)第三方库依赖继承分析
Java软件项目的各个模块通过自动化构建工具(例如Maven)中的依赖配置文件(例如pom.xml)声明第三方库依赖,而一个模块的依赖配置文件可以继承另一个模块的依赖配置文件;这一步通过分析Java软件项目各个模块的依赖配置文件的依赖继承关系,确定软件项目各个模块所依赖的Java第三方库版本;具体包括以下步骤:
1)递归遍历软件项目的代码库目录,获得软件项目各个模块的依赖配置文件;
2)解析每一个依赖配置文件的继承声明部分,获得各个依赖配置文件之间的继承关系,并建立依赖配置文件继承关系图;
3)从软件项目的根依赖配置文件进行依赖配置文件继承关系图的广度优先遍历,确定各个模块所依赖的第三方库版本。
(2)第三方库版本不一致检测
软件项目的不同模块可能使用了同一第三方库的不同版本;这一步通过分析各个模块的第三方库版本检测软件项目中的第三方库版本不一致问题,即遍历所有模块所依赖的第三方库版本,识别依赖同一第三方库的所有模块以及它们所依赖的第三方库版本,并分析这些第三方库版本是否是同一个版本,如果不是,那么检测到了一个第三方库版本不一致问题以及所影响的模块。
(3)第三方库版本统一代价分析
第三方库不同版本之间往往包含不兼容的第三方库API,影响到第三方库的统一代价;这一步通过API调用图的差异分析推荐第三方库的统一版本并量化统一到该第三方库版本的维护代价;具体包括以下步骤:
1)针对每一个第三方库版本不一致问题,在第三方库版本知识库中找到软件项目目前所依赖的第三方库版本二进制包、以及所有第三方库新版本的二进制包,作为第三方库版本统一的候选第三方库一致版本;
2)针对每一个候选第三方库一致版本,通过静态分析软件项目目前所依赖的第三方库版本二进制包、以及该候选版本的二进制包,分别建立软件项目所调用第三方库API的调用图,即该版本不一致问题所影响的模块所调用的第三方库API在目前所依赖的第三方库版本以及候选第三方库一致版本中的调用图;
3)通过调用图的差异对比分析确定各个模块所调用的第三方库API在候选第三方库一致版本中被删除和修改的API个数和调用次数,作为统一维护代价的度量,即如果各个模块所调用的第三方库API在候选第三方库一致版本中不存在,那么该第三方库API被删除了;如果各个模块所调用的第三方库API的调用图不相同、或者调用图相同但是调用图上的第三方库API方法体不相同,那么该第三方库API被修改了。
本发明的基本过程示意图如图1所示。本发明能够帮助开发人员识别软件项目不同模块调用的、在第三方库统一版本中没有发生变化的第三方库API(即开发人员不需要在版本统一时考虑这些API的兼容性问题)以及被删除和修改的第三方库API(即开发人员在版本统一时需要考虑这些API潜在的兼容性问题)。本发明方法通过细粒度的、基于第三方库API的版本统一维护代价驱使并帮助开发人员及时统一第三方库版本,减少开发人员的第三方库版本统一维护代价以及第三方库的长期维护代价。
附图说明
图1为本发明的基本过程示意图。
具体实施方式
以下针对Java、Maven软件项目说明本发明的具体实施方式,其主要过程为:
(1)第三方库依赖继承分析。通过遍历Java、Maven软件项目的代码库目录找到各个模块的依赖配置文件pom.xml,并通过解析各个pom.xml的parent和dependencyManagement部分获得依赖配置文件之间的继承关系并建立依赖配置文件继承关系图;通过广度优先遍历算法遍历该继承关系图,确定各个模块所依赖的第三方库版本;
(2)第三方库版本不一致检测。遍历所有模块所依赖的第三方库版本,识别依赖同一第三方库的所有模块以及它们所依赖的第三方库版本,并分析这些第三方库版本是否是同一个版本,如果不是,那么检测到了一个第三方库版本不一致问题以及所影响的模块;
(3)第三方库版本统一代价分析。通过静态分析工具Soot获得版本不一致问题所影响的模块所调用的第三方库API在目前所依赖的第三方库版本以及候选第三方库一致版本中的调用图;通过调用图的差异对比分析确定各个模块所调用的第三方库API在候选第三方库一致版本中被删除和修改的API个数和调用次数。
通过该过程所生成的第三方库版本统一推荐方案列举了各个候选统一版本的统一维护代价信息,帮助开发人员选择一个合适的第三方库版本进行版本统一。

Claims (3)

1. 基于API分析的Java第三方库版本统一推荐方法,其特征在于,具体步骤如下:
(1)第三方库依赖继承分析
Java软件项目的各个模块通过自动化构建工具中的依赖配置文件声明第三方库依赖,而一个模块的依赖配置文件可以继承另一个模块的依赖配置文件;通过分析Java软件项目各个模块的依赖配置文件的依赖继承关系,确定软件项目各个模块所依赖的Java第三方库版本;
(2)第三方库版本不一致检测
软件项目的不同模块使用同一第三方库的不同版本;通过分析各个模块的第三方库版本检测软件项目中的第三方库版本不一致问题,即遍历所有模块所依赖的第三方库版本,识别依赖同一第三方库的所有模块以及它们所依赖的第三方库版本,并分析这些第三方库版本是否是同一个版本,如果不是,那么检测到了一个第三方库版本不一致问题以及所影响的模块;
(3)第三方库版本统一代价分析
第三方库不同版本之间往往包含不兼容的第三方库API,影响到第三方库的统一代价;通过调用图的差异对比分析确定各个模块所调用的第三方库API在候选第三方库一致版本中被删除和修改的API个数和调用次数,作为统一维护代价的度量;通过静态分析工具Soot获得版本不一致问题所影响的模块所调用的第三方库API在目前所依赖的第三方库版本以及候选第三方库一致版本中的调用图;通过调用图的差异对比分析确定各个模块所调用的第三方库API在候选第三方库一致版本中被删除和修改的API个数和调用次数。
2.根据权利要求1所述的基于API分析的Java第三方库版本统一推荐方法,其特征在于,步骤(1)中所述的第三方库依赖继承分析,具体包括以下子步骤:
1)递归遍历软件项目的代码库目录,获得软件项目各个模块的依赖配置文件;
2)解析每一个依赖配置文件的继承声明部分,获得各个依赖配置文件之间的继承关系,并建立依赖配置文件继承关系图;
3)从软件项目的根依赖配置文件进行依赖配置文件继承关系图的广度优先遍历,确定各个模块所依赖的第三方库版本。
3.根据权利要求1所述的基于API分析的Java第三方库版本统一推荐方法,其特征在于,步骤(3)中所述的第三方库版本统一代价分析,具体包括以下子步骤:
1)针对每一个第三方库版本不一致问题,在第三方库版本知识库中找到软件项目目前所依赖的第三方库版本二进制包、以及所有第三方库新版本的二进制包,作为第三方库版本统一的候选第三方库一致版本;
2)针对每一个候选第三方库一致版本,通过静态分析软件项目目前所依赖的第三方库版本二进制包、以及该候选第三方库一致版本的二进制包,分别建立软件项目所调用第三方库API的调用图,即该版本不一致问题所影响的模块所调用的第三方库API在目前所依赖的第三方库版本以及候选第三方库一致版本中的调用图;
3)通过调用图的差异对比分析确定各个模块所调用的第三方库API在候选第三方库一致版本中被删除和修改的API个数和调用次数,作为统一维护代价的度量,即如果各个模块所调用的第三方库API在候选第三方库一致版本中不存在,那么该第三方库API被删除了;如果各个模块所调用的第三方库API的调用图不相同,或者调用图相同但是调用图上的第三方库API方法体不相同,那么该第三方库API被修改了。
CN202010077124.5A 2020-01-23 2020-01-23 基于API分析的Java第三方库版本统一推荐方法 Active CN111190641B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010077124.5A CN111190641B (zh) 2020-01-23 2020-01-23 基于API分析的Java第三方库版本统一推荐方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010077124.5A CN111190641B (zh) 2020-01-23 2020-01-23 基于API分析的Java第三方库版本统一推荐方法

Publications (2)

Publication Number Publication Date
CN111190641A CN111190641A (zh) 2020-05-22
CN111190641B true CN111190641B (zh) 2021-08-17

Family

ID=70710347

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010077124.5A Active CN111190641B (zh) 2020-01-23 2020-01-23 基于API分析的Java第三方库版本统一推荐方法

Country Status (1)

Country Link
CN (1) CN111190641B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112182199A (zh) * 2020-09-10 2021-01-05 中信银行股份有限公司 一种依赖包推荐方法、装置、电子设备和可读存储介质
CN113010207A (zh) * 2021-03-18 2021-06-22 挂号网(杭州)科技有限公司 资源配置方法、装置、电子设备及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1845076A (zh) * 2006-05-11 2006-10-11 复旦大学 面向xml的标记回溯的一致性维护方法
CN106897153A (zh) * 2015-12-18 2017-06-27 阿里巴巴集团控股有限公司 调用应用编程接口的方法和系统

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10740093B2 (en) * 2016-09-01 2020-08-11 Dropbox, Inc. Advanced packaging techniques for improving work flows
US10778810B2 (en) * 2016-09-25 2020-09-15 Salesforce.Com, Inc. Staging and deployment to multiple service clouds
CN107707625A (zh) * 2017-09-05 2018-02-16 江苏电力信息技术有限公司 基于Maven的前台资源打包并进行版本管理与使用的方法
CN109240837B (zh) * 2018-09-11 2020-09-29 四川虹微技术有限公司 一种通用云存储服务api的构建方法
CN110297657B (zh) * 2019-06-11 2023-07-21 东南大学 一种基于层次上下文的api推荐方法
CN110378118B (zh) * 2019-06-26 2022-11-25 南京理工大学 高效准确的安卓应用第三方库检测方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1845076A (zh) * 2006-05-11 2006-10-11 复旦大学 面向xml的标记回溯的一致性维护方法
CN106897153A (zh) * 2015-12-18 2017-06-27 阿里巴巴集团控股有限公司 调用应用编程接口的方法和系统

Also Published As

Publication number Publication date
CN111190641A (zh) 2020-05-22

Similar Documents

Publication Publication Date Title
Petrović et al. State of mutation testing at google
Petrović et al. Practical mutation testing at scale: A view from google
US8434054B2 (en) System and method for managing cross project dependencies at development time
Prähofer et al. Static code analysis of IEC 61131-3 programs: Comprehensive tool support and experiences from large-scale industrial application
Zhang et al. Pensieve: Non-intrusive failure reproduction for distributed systems using the event chaining approach
US20050262482A1 (en) System and method for efficiently analyzing and building interdependent resources in a software project
JP2009540464A (ja) 反復的な静的および動的ソフトウェア分析
CN111190641B (zh) 基于API分析的Java第三方库版本统一推荐方法
Kirbas et al. The relationship between evolutionary coupling and defects in large industrial software
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
CN112181858B (zh) Java软件项目依赖冲突语义一致性的自动化检测方法
Herzig et al. Mining cause-effect-chains from version histories
Escobar-Velásquez et al. Enabling mutant generation for open-and closed-source Android apps
CN112965913A (zh) 一种Java软件依赖冲突问题自动化修复的方法
CN112860312A (zh) 项目依赖关系变化的检测方法及装置
CN115705250A (zh) 监测堆栈使用量以优化程序
CN109271322B (zh) 一种软件测试范围确定方法、软件测试方法和装置
CN111240719B (zh) 缺陷驱动的第三方库版本升级推荐方法
GB2504122A (en) Locating software units of a software module to facilitate software refactoring
Spasojević et al. Mining the ecosystem to improve type inference for dynamically typed languages
Molitorisz Pattern-based refactoring process of sequential source code
Liu et al. Towards understanding bugs in python interpreters
Sun et al. Automatically assessing and extending code coverage for NPM packages
Mukelabai et al. Semi-automated test-case propagation in fork ecosystems
Khan et al. Detecting wake lock leaks in android apps using machine learning

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
GR01 Patent grant