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

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


                 2.2   调研结果
                    我们将调研结果展示在表          3  中, 它包含了调研得到的依赖异味类别, 各个类别对应的问题报告和构建工具以
                 及可能造成的危害. 我们用表         4  中的编号来表示对应危害. 接下来我们将结合表格介绍我们对                   RQ1  和  RQ2  的调
                 研结果. 由于篇幅限制, 本文中仅介绍部分依赖异味类别, 剩余部分参见附录                      A.

                                                   表 3 实证研究调研结果

                   异味编号            异味名称            异味粒度      对应构建工具        对应问题报告数           主要危害
                     1.1          内外类冲突            模块粒度      Maven|Gradle      2/47           1, 3, 4
                     1.2          外部类冲突            模块粒度      Maven|Gradle      7/47           1, 3, 4
                     1.3          库版本冲突            模块粒度      Maven|Gradle      7/47           1, 3, 4
                     1.4          未声明依赖            模块粒度      Maven|Gradle      6/47           1, 3, 4
                     1.5          未使用依赖            模块粒度      Maven|Gradle      6/47          2, 5, 7, 9
                     1.6         依赖范围误用            模块粒度      Maven|Gradle      12/47      1, 2, 3, 5, 6, 7, 8, 9
                     1.7         依赖范围冲突            模块粒度         Maven          2/47            1, 3
                     1.8          依赖树冲突            模块粒度      Maven&Gradle      1/47          1, 3, 4, 11
                     2.1       构建工具配置缺失            项目粒度      Maven|Gradle      2/47             1
                     2.2     构建工具封装器JAR缺失          项目粒度      Maven|Gradle      6/47             1
                     2.3     构建工具封装器JAR异常          项目粒度      Maven|Gradle      1/47            2, 10
                     2.4         模块间库重复            项目粒度      Maven|Gradle      2/47            11
                     2.5         模块间库冲突            项目粒度      Maven|Gradle      1/47            11

                                                   表 4 依赖异味主要危害

                      编号                潜在危害                                 详细说明
                       1                构建错误                             模块构建时出现错误
                       2              构建时间增加                            模块构建所需时间增加
                       3               运行时错误                             模块运行时出现异常
                       4             运行时语义冲突                           模块运行结果与预期不一致
                       5              构建产物冗余                       模块构建产物 (可执行JAR) 体积增大
                       6             下游模块构建错误                      当前模块的下游模块构建时出现错误
                       7           下游模块构建时间增加                      当前模块的下游模块构建所需时间增加
                       8            下游模块运行时错误                      当前模块的下游模块运行时出现异常
                       9           下游模块构建产物冗余                    当前模块的下游模块运行结果与预期不一致
                       10               安全隐患                    项目在使用构建工具时执行被植入的恶意代码
                       11           依赖库维护难度增加                项目无法统一调整多个同名依赖库的版本而需多次调整

                 2.2.1    RQ1: Java 项目中可能存在哪些依赖异味类别?
                    最终我们筛选出       47  个依赖异味相关的问题报告, 总结出          13  类特征各异的依赖异味. 已有研究尚未关注到其
                 中  7  类依赖异味  (异味  1.4、1.7–1.8、2.1–2.4), 而仅从  Maven  的角度对其余  6  类依赖异味进行了部分探讨. 我们
                 的研究不仅在依赖异味的类别上有所扩展, 还综合考虑了                   Maven  和  Gradle 这两大主流构建工具. 为了方便研究,
                 我们把这些依赖异味分为两种粒度, 即模块粒度和项目粒度. 这两种粒度分别代表了依赖异味出现在单个模块中
                 还是整个项目中. 需要说明的是, 模块粒度关注单个模块与其依赖库之间的关系, 而项目粒度则关注项目中多个模
                 块之间的关系, 因此这样的划分方式确保了分类的独立性, 它们之间没有重叠.
                    1) 模块粒度
                    在模块级别的分析中, 我们发现了           36  个 (占比  36/47=76.6%) 问题报告中包含的   8  种 (占比  8/13=61.5%) 依赖
                 异味, 对应于表    3  中的  1.1–1.8. 在进行分类时, 我们结合问题报告中涉及的依赖管理的具体实体                  (如依赖范围) 进
                 行分析. 最终, 我们总结出       8  类依赖异味, 它们全面概括了       36  个问题报告中的特征. 其中值得注意的是, 异味             1.7
                 仅在使用    Maven  中出现, 而异味   1.8  仅在同时使用    Maven  和  Gradle  时才会出现, 其余异味在使用       Maven  或
   120   121   122   123   124   125   126   127   128   129   130