第三方库依赖冲突问题研究综述.pdf
《第三方库依赖冲突问题研究综述.pdf》由会员分享,可在线阅读,更多相关《第三方库依赖冲突问题研究综述.pdf(25页珍藏版)》请在文库网上搜索。
1、第三方库依赖冲突问题研究综述*李硕1,2,刘杰1,2,3,王帅1,田浩翔1,2,叶丹1,2,31(中国科学院软件研究所,北京100190)2(中国科学院大学,北京100049)3(计算机科学国家重点实验室(中国科学院软件研究所),北京100190)通信作者:刘杰,E-mail:;叶丹,E-mail:摘要:软件开发过程中,开发人员通过大量使用第三方库来实现代码复用.不同第三方库之间存在依赖关系,第三方库间的不兼容会导致第三方库的安装、加载、调用时出现错误,进而导致系统异常,这类问题称之为第三方库依赖冲突问题.依赖冲突的根本原因是加载的第三方库无法覆盖软件引用的必需特性(例如:方法).依赖冲突问题
2、会在第三方库的下载安装,项目编译和运行时中出现,且定位困难.依赖冲突问题的修复要求开发人员对使用的第三方库版本间差别具有准确的理解,并且第三方库之间复杂的依赖关系增加了修复难度.为了能够在软件运行前,发现软件中存在的依赖冲突,并且能够响应和处理运行过程中由依赖冲突引发的系统异常,国内外学者展开了各种针对依赖冲突问题的研究.从依赖冲突问题的 4 个方面,对当前已有研究工作进行了梳理,包括:第三方库的使用实证分析、依赖冲突原因分析、依赖冲突检测方法以及依赖冲突常用修复方式.最后对该领域未来值得关注的研究问题进行了展望.关键词:依赖冲突;第三方库;软件生态系统;依赖管理;函数接口兼容性中图法分类号:
3、TP311中文引用格式:李硕,刘杰,王帅,田浩翔,叶丹.第三方库依赖冲突问题研究综述.软件学报,2023,34(10):46364660.http:/ on Dependency Conflict Problem of Third-party LibrariesLIShuo1,2,LIUJie1,2,3,WANGShuai1,TIANHao-Xiang1,2,YEDan1,2,31(InstituteofSoftware,ChineseAcademyofSciences,Beijing100190,China)2(UniversityofChineseAcademyofSciences,Bei
4、jing100049,China)3(StateKeyLaboratoryofComputerScience(InstituteofSoftware,ChineseAcademyofSciences),Beijing100190,China)Abstract:During software development,developers use third-party libraries extensively to achieve code reuse.Due to the dependenciesamong different third-party libraries,the incomp
5、atibilities among them lead to errors during the installing,loading,or calling of thoselibraries and ultimately result in system anomalies.Such a problem is called a dependency conflict(DC,also referred to as conflictdependency or CD)issue of third-party libraries.The root cause of such issues is th
6、at the third-party libraries loaded fail to cover therequired features(e.g.,methods)cited by the software.DC issues often occur during the download and install,project compiling,andrunningofthird-partylibrariesandaredifficulttolocate.FixingDCissuesrequiresdeveloperstoknowthedifferencesamongtheversio
7、nsofthethird-partylibrariestheyuseaccurately,andthecomplexdependenciesamongthethird-partylibrariesincreasethedifficultyinthiswork.ToidentifytheDCissuesinthesoftwarebeforeitsrunningandtodealwiththesystemanomaliescausedbythoseissuesduring*基金项目:国家重点研发计划(2017YFA0700603);国家自然科学基金(61972386)收稿时间:2021-10-09
8、;修改时间:2021-12-28,2022-01-06,2022-01-16;采用时间:2022-02-18;jos 在线出版时间:2022-05-24CNKI 网络首发时间:2023-04-06软件学报ISSN1000-9825,CODENRUXUEWE-mail:Journal of Software,2023,34(10):46364660doi:10.13328/ki.jos.006666http:/中国科学院软件研究所版权所有.Tel:+86-10-62562563running,researchers around the world have conducted various
9、studies on such issues.This study presents a systematic review of thisresearch topic from four aspects,including the empirical analysis of third-party library usage,the cause analysis of DC issues,and thedetectionmethodsandcommonfixingwaysforsuchissues.Finally,thepotentialresearchopportunitiesinthis
10、fieldarediscussed.Key words:dependencyconflicts;third-partylibraries;softwareecosystem;dependencymanagement;APIcompatibility 1 引言 1.1 研究背景第三方库(又称第三方依赖或软件包)是一种重要的可复用软件资源,在一定条件下,可以独立于其他第三方库进行安装和删除1.软件开发过程中调用第三方库是一种提高开发效率的普遍做法,特别是随着现代信息技术的迅速发展,软件规模不断增加,软件开发对第三方库的依赖也在不断增加.已有研究工作表明一个项目直接依赖于多个不同的库2.此外,由于第
11、三方库之间存在依赖关系,一个项目往往会被隐式的加入更多的依赖关系,导致依赖更多的库25.第三方库的使用大大提升了软件开发效率,但也给软件开发带来了潜在的风险.当加载的第三方库无法覆盖所在项目的必需特性(例如,方法)时,就会发生依赖冲突问题.结合软件工程的开发实践,开发人员可能会采用buildtools 自动完成第三方库的下载安装和项目编译,也可能根据配置文件,手动下载安装第三方库,再执行项目编译.因此,依赖冲突问题会在第三方库下载安装、项目编译和运行过程中出现,比如:克隆了 GitHub 上的某个项目,需要下载第三方库时,由于没有满足引用的第三方库之间的约束条件,导致第三方库下载安装失败;在项
12、目编译时,由于本地环境中,存在与引用的第三方库重名的代码文件,导致无法加载正确的第三方库或使用了第三方库中不存在的相关方法,项目编译报错;在运行阶段,由于加载的第三方库版本与所需版本不一致,提示找不到某些类或方法,抛出异常,程序运行失败.目前对依赖冲突的解决方式多为开发人员借助经验知识去处理,会消耗大量的时间和人工成本.运行过程中的报错信息在多数情况下不足以支撑开发人员找到问题根源,并且由于第三方库之间存在复杂的调用关系,更改某一第三方库同时可能引起其他第三方库的不适用,这些问题增加了定位和解决依赖冲突问题的难度.同时依赖冲突问题会伴随如下特点:难以重现问题出现的场景、编译器提示的问题报告中描
13、述信息不够清晰、第三方库代码缺失、第三方库代码复杂难以调试等.这些问题在开发过程中给开发人员带来了巨大挑战.依赖冲突问题的检测和修复成为当前软件开发中的重要技能.为了避免依赖冲突问题的出现,第三方库的开发人员提出了一种声明机制,即在 metadata 中对库本身依赖的其他第三方库信息进行声明.但是由于 metadata信息需要开发人员手动维护,难以保证其时效性和准确性.Maven68、Pip9等成熟的软件管理工具也提供了依赖关系管理功能,帮助开发人员在开发过程中选择依赖的第三方库版本.但由于多种复杂因素,这些工具不能保证加载的是最契合开发人员需求的版本,并且由于开发人员可能缺乏对依赖的第三方库
14、的了解,导致错误的几率增加.1.2 文献检索方式针对以上分析,研究人员对第三方库的使用情况和依赖冲突问题的产生原因、检测方法、修复方式都开展了大量研究.为了对该问题的已有研究工作和成果进行系统的梳理,我们首先选择了文献搜索的关键词:dependencyconflict、conflictdependency、third-partylibrary、第三方库、依赖冲突、包管理.随后在谷歌学术搜索引擎(GoogleScholar)、ACMDigitalLibrary、IEEEExplore、Springer、Elsevier 以及 CNKI 等搜索引擎和数据库上,通过上述关键词来检索与本文主题相关的论
15、文.对上述检索的文献进行筛选,筛选条件包括:与本文主题的相关性、文献质量.通过文献标题、关键词、摘要等信息,识别并移除与主题无关的文献;在与主题相关的文献中,选择发表会议/期刊属于 CCF 推荐的国际学术会议/期刊的文章.通过 GoogleScholar、ACMDigitalLibrary、IEEEExplore 等学术搜索引擎来查阅论文的被引用情况和相关研究人员已发表论文的清单,进一步补充与本文研究主题相关的文献集.最终确定了与本文主题相关的高质量论文.李硕等:第三方库依赖冲突问题研究综述4637经过筛选后,我们发现尚未有对依赖冲突问题进行全面综述的文献.早在 2006 年 Mancinel
16、li 等人10、2012年 Artho 等人1,介绍的依赖冲突有关问题,是针对 Linux 中的依赖冲突问题.而后学术界和工业界逐渐对依赖冲突问题进行关注.为了使得本文内容更加完整,且更好地反映相关研究的发展脉络,本文中所介绍论文与已有论文可能会存在少部分重叠.最终,本论文选取了 90 篇相关论文进行详细介绍,图 1 展示了搜集论文统计结果.参照CCF 推荐领域划分标准,图 1(a)展示了所选论文主要集中在软件工程/系统软件/程序设计语言领域.图 1(b)展示了所选文章发表会议/期刊的分布情况,其中包括会议论文 71 篇,期刊论文 16 篇;大多数论文是所涉及领域的高质量会议和期刊,例如 IC
17、SE 会议(14 篇)、ESEC/FSE 会议(11 篇)、ASE 会议(5 篇)、CCS 会议(2 篇)、OOPSLA(1 篇)、ECOOP 会议(1 篇)、NDSS 会议(2 篇)、ESE 期刊(4 篇)、TSE 会议(4 篇)、IST 期刊(2 篇)、软件学报(3 篇).(a)选文发表领域分布2520151050200520062007201020112012201320142015201720162019202020182021(b)不同会议或期刊论文发表分布篇数软件工程/系统软件/程序设计语言网络与信息安全人工智能77616其他图1选文统计结果 1.3 研究问题本文在对当前已有研究成
18、果梳理基础上,对依赖冲突问题进行了全面的综述,包括 4 个方面:第三方库的使用情况,依赖冲突原因分析,有关检测方法以及当前开发人员采用的修复方式,并对该领域未来潜在的值得关注的研究方向进行展望.本文主要选择了 GitHub 使用语言排行榜11中的前 3 种使用最为广泛的语言(JavaScript、Java 和 Python)以及多个生态系统中依赖冲突问题作为研究对象进行分析,并尝试回答以下 4 个问题.问题 1:有关第三方库使用情况以及开发情况是怎样的?与依赖冲突问题的关系是怎样的?问题 2:依赖冲突问题发生的原因是什么,可以被划分为哪些模式?问题 3:依赖冲突问题检测方法有哪些,特点是什么?
19、问题 4:目前开发人员修复依赖冲突的方式是什么?本文第 2 节给出整体研究框架.第 3 节对依赖冲突问题的相关实证分析,进行总结分类.第 4 节系统分析依赖冲突问题发生的根本原因.第 5 节对依赖冲突问题的检测方法进行分类阐述,并对工具进行对比.第 6 节总结依赖冲突问题的修复方式.最后对该领域未来潜在值得关注的研究方向进行展望.2 第三方库依赖冲突问题与研究框架 2.1 第三方库依赖冲突问题简介大量引用第三方库极易引发依赖冲突问题.此类问题的出现是由于当同一个库的多个版本存在于相同路径下时,Java、Python、JavaScript 等第三方库的加载机制规定了第三方库在运行时的加载位置12
20、,多数情况下当两个第三方库无法共存时,那么将只有一个第三方库被加载,而与之存在冲突的其他第三方库无法安装或无法加载5,当项目在运行时引用不兼容的、被隐藏掉的第三方时,将引发运行时异常(例如,ClassNotFoundException和 NoSuchMethodError2).此类问题称之为依赖冲突问题(conflictdependency,或是 dependencyconflict).除两个第三方库包含内容直接导致冲突外,也可能因为其依赖的底层第三方库互相冲突.因此,两个看似毫无关联的第三方4638软件学报2023 年第 34 卷第 10 期库也可能因为依赖冲突而无法安装13.第三方库依赖冲
21、突的表现形式是依赖的第三方库和实际使用的第三方库不一致.图 2 为 Keras 框架中出现的依赖冲突问题实例14,当开发人员加载的 TensorFlow 版本为 1.X 时,程序无法正常运行,提示 AttributeError,其原因为加载的类不包含项目需要引用的方法,此实例为典型的依赖冲突问题,此种类型常出现在运行阶段异常2,1518,其他类型的依赖冲突问题也可能出现在第三方库的安装阶段和项目编译过程17,19.伴随着大型系统的普及,第三方库之间的冲突问题更加广泛频繁出现.原因在于大型系统广泛依赖于第三方库,并且大型系统的开发多采用微服务、多模块的开发方式;一个大型系统,分为多个服务,由不同
22、的团队进行开发,开发过程中,协调依赖的第三方库、保证库以及对应的版本的一致性非常困难.Jibesh 等人16进行的实证研究分析发现,1/4 的第三方库存在潜在的冲突,可能导致软件崩溃或其他意外的行为.已有研究工作主要集中在对依赖冲突问题的实证研究、对依赖冲突表现形式的分析、对依赖冲突问题的检测方法的研究以及对依赖冲突问题的解决方法的研究.图2依赖冲突实例常见的依赖冲突问题表现形式多样:安装过程中的表现形式为安装第三方库失败,提示异常信息;运行过程中的表现形式为编译器提示无法找到需要的类或方法;或通过了编译过程,但无法得到正确的运行结果18.依赖冲突问题的原因复杂多样,本文将其概括为 3 种类别
23、,包括:版本冲突、版本误用、名称冲突.版本冲突包含两种类型:同一个第三方库之间的冲突和不同第三方库之间的冲突.同一个第三方库之间的冲突可以划分为直接依赖与传递依赖之间的冲突、传递依赖之间的冲突、所需第三方库与本地安装的第三方库之间的冲突.不同第三方库之间的冲突,可以划分为直接依赖间的冲突、直接依赖与传递依赖之间的冲突、传递依赖之间的冲突.版本误用表现形式为对第三方库版本的误用导致的依赖冲突.名称冲突指项目代码和第三方库之间的命名冲突,此种类型较为少见.目前对依赖冲突问题的检测工具相对较少,主要集中在对第三方库的冲突问题进行预判,提示开发人员可能存在的风险15,19,20,也有部分工作针对存在依
24、赖冲突问题的项目生成测试用例,报告出现问题的原因2,1618.对于依赖冲突问题的修复,目前主要依靠人工修复方式完成.2.2 研究框架本文的整体研究框架如图 3 所示.按照 GitHub 使用语言排行榜11,主要关注排行榜中前 3 名的语言JavaScript、Python、Java.JavaScript 社区、Java 社区和 Python 社区包含了对应语言以及对语言有关问题的讨论.本文提及的 npm、PyPI 代指 npm 生态系统、PyPI 生态系统.npm 生态系统、Maven 生态系统和 Eclipse 社区、PyPI 生态系统为对应语言提供了第三方库的下载以及管理通道.其他较大规模
25、社区,例如 R/CRAN社区,Android社区以及 Linux 社区等,是在本文的研究过程中,发现的相关社区,作为补充内容.JavaScript 和 Python 是动态类型的脚本语言,Java 是静态类型的程序设计语言.3 种语言具有各自的特性,包管理模式间也存在差异,但三者在依赖冲突问题上可以抽取共性.依赖冲突问题发生在第三方库的使用过程中,因此本文首先对第三方库使用的相关研究工作进行了分类汇总;其次对导致依赖冲突的原因进行了分类分析;接着参照依赖冲突的原因对依赖冲突问题的检测方法进行分类,并对比总结检测工具,然后参照开发人员采取的 7 种修复方式进行分类,最后进行总结并指出未来的潜在研
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 依赖 冲突 问题 研究 综述