Page 134 - 《软件学报》2025年第7期
P. 134

孙伟杰 等: Java 依赖异味的实证研究与统一检测技术                                                    3055


                 3.2   检测工具实现
                    基于上述依赖异味检测流程, 我们开发了名为               JDepAna 的依赖异味检测工具. 它支持对前述所有依赖异味进
                 行检测, 并且可以应用于       Maven  和  Gradle 项目.
                    由于  Maven  和  Gradle 在依赖模型的具体实现上存在显著的差异, 我们采取了如图                7  所示的结构进行实现, 以
                 尽可能复用检测算法的同时, 确保           JDepAna 能够正常检测     Maven  和  Gradle 项目. 我们将依赖模型的定义和检测
                 算法作为检测核心       JDepAna-core, 在其中定义依赖模型为抽象类, 包含获取依赖管理信息的接口. 各种检测算法可
                 以通过该接口获取依赖模型数据, 实现自身的检测逻辑, 而无须关心依赖模型构建的细节. 此外, 我们以同样的
                 JDepAna-core 为核心, 分别实现了    Maven  和  Gradle 两种构建工具下的插件     JDepAna-maven-plugin  和  JDepAna-
                 gradle-plugin. 在插件中, 我们根据  Maven  和  Gradle 依赖管理的不同特性, 分别对依赖模型中定义的函数进行重载,
                 以实现先前定义的获取依赖管理信息的接口.

                                                        JDepAna
                                     依赖模型和检测算法                           构建工具适配
                                        JDepAna-core                 JDepAna-plugins
                                             定义依赖模型接口       适配 Maven              适配 Gradle
                                         DepModel
                                                            JDepAna-maven-plugin  JDepAna-gradle-plugin
                                   public interface DepModel{
                                    Callgraph getCallGraph();
                                    DepTree getDepTree();
                                      …                      实现依赖模型接口
                                   }
                                             利用接口实现检测算法

                                       AlgorithmFactory
                                    + LibraryConflictSmell()
                                    …

                                                    图 7 JDepAna 的实现

                    在实现对    Maven  和  Gradle 的适配过程中, 为了实现检测流程的完全自动化, 我们通过              Maven  和  Gradle 的插
                 件特性, 介入   Maven  和  Gradle 的依赖解析过程, 将依赖异味检测功能像项目的构建任务一样无缝嵌入项目的自动
                 化流程中, 从而实现了基本信息的提取、依赖树的解析以及依赖包集合的解析等功能. 而在构建调用图时, 我们主
                 要采用了静态分析框架        Soot [45] , 同时结合  JavaParser [46] 和  Javassist [47] 分别对源码和字节码进行静态分析.

                 4   实验评估
                    在实验中, 我们通过以下两个研究问题来评估               JDepAna 的有效性和实用性, 由于现有研究中缺少可以同时分
                 析  Maven  和  Gradle 项目的工具, 我们更多地注重验证我们方法的检测能力和范围.
                    ● RQ3 (有效性): JDepAna 能否检测出已知的依赖异味问题?
                    ● RQ4 (实用性): JDepAna 能否在流行的     Java 项目中检测出新的依赖异味问题?
                    为了回答    RQ3, 我们选择了在第     3.1  节中收集的问题报告, 这些报告涉及实际识别的依赖异味问题. 基于这些
                 报告, 我们构建了一个基准集, 并应用          JDepAna 工具于基准集中的相应项目和模块. 我们通过分析这些检测结果,
                 评估  JDepAna 是否能有效识别这些已知的依赖异味问题.
                    为了回答    RQ4, 我们收集了    GitHub  上广受欢迎的   Maven  和  Gradle 项目, 并使用  JDepAna 对这些项目进行分
                 析, 以探测当前未被识别的依赖异味实例. 筛选并人工验证这些检测到的实例后, 我们从中挑选出具有代表性且具
                 价值的问题报告, 并以      GitHub  问题报告的形式提交给开发者, 以便进一步确认.
                    值得注意的是, RQ3     专注于复现性验证, 即检验工具是否能准确地识别出已被记录并确认的依赖异味问题.
   129   130   131   132   133   134   135   136   137   138   139