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

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


                    2) 类别  1.2  外部类冲突 (如算法   A2  所示)

                 算法 A2. 外部类冲突检测.
                 输入: DJ: 依赖包集合;
                 输出: JS: 出现外部类冲突的依赖库对集合.
                 1.   JS ⇐ {}
                 2.   classToJarMap ⇐ {}
                 3.   for depJar ∈ DJ do
                 4.    depClasses ⇐ depJar.sourceClasses
                 5.    classToJarMap[depClasses].add(depJar)
                 6.   end for
                 7.   for class ∈ classToJarMap, keys do
                 8.    conflictJars ⇐ classToJarMap[class]
                 9.    if conflictJars.size() > 1 and not conflictJars ∈ JS then
                 10.   JS.add(conflictJars)
                 11.  end if
                 12. end for

                    该算法接受依赖包集合         DJ 作为输入, 并输出出现外部类冲突的依赖库对集合               JS. 算法的工作流程如下: 首先,
                 初始化依赖库对集合        JS (第  1  行). 接着, 创建一个哈希表    classToJarMap  用于存储类与依赖包的映射关系          (第
                 2  行). 然后, 算法遍历依赖包集合      DJ 中的每一个依赖包       depJar (第  3  行), 并提取该依赖包的类集合      depClasses
                 (第  4  行). 接下来, 算法将依赖包   depJar 添加到哈希表    classToJarMap  中对应类集合  depClasses 的映射关系中   (第
                 5  行). 完成依赖包遍历后, 算法接着遍历        classToJarMap  的所有类  (第  7  行). 对于每一个类  class, 算法获取对应的
                 依赖包集合    conflictJars (第  8  行). 如果  conflictJars 的大小大于  1  且不在集合  JS  中, 算法将  conflictJars 添加到集
                 合  JS  中  (第  9–10  行). 最后, 算法结束对类的遍历  (第  12  行), 并完成外部类冲突的检测.
                    3) 类别  1.3  库版本冲突 (如算法   A3  所示)

                 算法 A3. 库版本冲突检测.
                 输入: DT: 依赖树;
                 输出: JS: 出现库版本冲突的依赖库集合.
                 1.   JS ⇐ {}
                 2.   depToVersionMap ⇐ {}
                 3.   for dep ∈ DT do
                 4.    depName ⇐ dep.name
                 5.    depVer ⇐ dep.version
                 6.    depToVersionMap[depName].add(depVer);
                 7.   end for
                 8.   for dep ∈ depToVersionMap.keys do
                 9.    if depToVersionMap[dep].size() > 1 then
                 10.     JS.add(dep)
                 11.  end if
                 12. end for
   155   156   157   158   159   160   161   162   163   164   165