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 专注于复现性验证, 即检验工具是否能准确地识别出已被记录并确认的依赖异味问题.

