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

3056                                                       软件学报  2025  年第  36  卷第  7  期


                 而  RQ4  则侧重于探索性发现, 旨在揭示        JDepAna 在实际、复杂的项目环境中对新问题的检测能力. 这两部分不仅
                 相互形成对比, 还互为佐证, 全面展示了检测工具的性能.

                 4.1   RQ3: 有效性

                 4.1.1    实验设置
                    我们对实证研究中收集到的           47  个问题报告进行了进一步筛选, 排除其中两类不属于我们检测对象的问题报
                 告: 第  1  类是报告中的依赖异味是下游项目使用中遇到的问题, 而不是当前项目; 第                     2  类是由于时间跨度较大, 报
                 告对应版本的项目已无法获取当时的依赖库, 导致无法进行正常构建和构建调用图. 最终我们得到了                                28  个问题报
                 告, 其中  16  个与  Maven  相关, 12  个与  Gradle 相关.
                    为了对   JDepAna 的检测结果进行精细评估, 我们从问题报告对应的修复中提取了相应的依赖异味实例. 这些
                 实例被定义为包含依赖异味特征的最小单元, 以元组<项目, 模块, 依赖异味编号, 问题说明>来表示, 分别代表了
                 异味出现的项目和模块、所属类别以及具体信息. 依赖异味实例的引入能够避免宽泛的检测标准, 确保工具不仅
                 能识别问题的存在, 还能细致检测呈现出依赖异味特征的具体依赖库. 以图                       8  中#ASJV-4539 [48] 为例, 项目  aws-sdk-
                 java-v2  中的模块  core/auth  中出现了依赖异味未声明依赖, 其中两个依赖库           software.amazon.awssdk:http-auth-spi
                 和  soft-ware.amazon.awssdk:checksums 都被使用但未在配置文件中声明. 若没有依赖异味实例的细分, JDepAna 只
                 需检测出未声明依赖即可视为成功. 然而, 基于依赖异味实例的划分, 该问题实际包含两个实例<aws-sdk-java-v2,
                 core/auth, 1.4, software.amazon.awssdk:http-auth-spi>和<aws-sdk-java-v2, core/auth, 1.4, software.amazon.awssdk:
                 checksum>, 这意味着 JDepAna 需分别检出这两个具体依赖库的未声明特征, 才能算作全面检测. 这些实例中                        aws-
                 sdk-java-v2  对应于项目名, core/auth  代表出现依赖异味的具体模块, 1.4      对应于未声明依赖的异味编号, software.
                 amazon.awssdk:http-auth-spi 和  soft-ware.amazon.awssdk:checksums 对应于问题说明也即被使用但未被声明的具体
                 依赖库. 值得注意的是, 不同类别的依赖异味虽然都会被划分为依赖异味实例, 但在问题说明中的描述方式有所不
                 同. 例如对于外部类冲突这类异味, 当多个依赖库中存在冲突类时, 问题说明会列出所有包含这些冲突类的依赖
                 库, 并将其作为一个实例处理; 而在异味           1.4  未声明依赖中, 问题说明则对应于使用但未声明的具体依赖库.
















                                                                            两个依赖异味实例











                                                     图 8 依赖异味实例

                    按照以上流程, 我们最终提取出了           16  个  Maven  相关问题报告中的   125  个实例和  12  个  Gradle 相关问题报告
                 中的  22  个实例, 这  147  个实例构成了我们的基准集, 覆盖了         13  个异味类别中的    10  类. 对于基准集中的依赖异味
   130   131   132   133   134   135   136   137   138   139   140