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

