Page 146 - 《软件学报》2025年第7期
P. 146
孙伟杰 等: Java 依赖异味的实证研究与统一检测技术 3067
46th IEEE/ACM Int’l Conf. on Software Engineering. Lisbon: ACM, 2024. 212. [doi: 10.1145/3597503.3639230]
[88] Guo WB, Xu ZZ, Liu CW, Huang C, Fang Y, Liu Y. An empirical study of malicious code in PyPI ecosystem. In: Proc. of the 38th
IEEE/ACM Int’l Conf. on Automated Software Engineering (ASE). Luxembourg: IEEE, 2023. 166–177. [doi: 10.1109/ASE56229.2023.
00135]
[89] org.json classes conflict with the current json library. #8, 2024. https://github.com/SAP/gigya-java-sdk/issues/8
[90] Dependency tree issue. #127, 2024. https://github.com/SpaiR/imgui-java/issues/127
[91] google-auth-library-credentials version collision in dependency tree. #79, 2024. https://github.com/spring-attic/spring-cloud-gcp/issues/79
[92] Evaluate Maven-wrapper to fix inconsistencies in dependencies.md. #441, 2024. https://github.com/exasol/project-keeper/issues/441
[93] Centralize versions for common dependencies. #235, 2024. https://github.com/stargate/stargate/pull/235
[94] Duplicate classes caught by maven-enforcer-plugin. #2642, 2024. https://github.com/apache/pulsar/issues/2642
附中文参考文献:
[59] 许畅, 秦逸, 余萍, 曹春, 吕建. 可成长软件理论方法和实现技术: 从范型到跨越. 中国科学: 信息科学, 2020, 50(11): 1595–1611. [doi:
10.1360/SSI-2020-0079]
[60] 金芝, 周明辉, 张宇霞. 开源软件与开源软件生态: 现状与趋势. 科技导报, 2016, 34(14): 42–48. [doi: 10.3981/j.issn.1000-7857.
2016.14.005]
[71] 王莹, 伍盈欣, 高天, 陈子莺, 许畅, 于海, 张成志. 开源软件库生态治理技术研究综述: 二十年进展. 软件学报, 2024, 35(2): 629–674.
http://www.jos.org.cn/1000-9825/6983.htm [doi: 10.13328/j.cnki.jos.006983]
[72] 梁冠宇, 武延军, 吴敬征, 赵琛. 面向操作系统可靠性保障的开源软件供应链. 软件学报, 2020, 31(10): 3056–3073. http://www.jos.org.
cn/1000-9825/6070.htm [doi: 10.13328/j.cnki.jos.006070]
附录 A
在本附录中, 我们将继续探讨 Java 项目中的依赖异味, 描述正文中未涉及异味的特征, 可能危害与触发场景
以及对应检测算法. 通过实证研究, 我们确定了 13 类依赖异味, 而正文已经涵盖了其中 5 类异味的特征, 3 类异味
的部分危害与相应触发场景以及 1 类异味的检测算法. 接下来, 我们将详细介绍剩余未涉及的异味和对应检测
算法.
A1 依赖异味分类与特征
在正文中, 我们已经对异味 1.6、1.7、1.8、2.2 和 2.3 进行了详细的介绍, 下面将继续介绍剩余的异味.
A1.1 模块粒度
1) 类别 1.1 内外类名冲突: 模块与依赖库中包含完全限定名相同的类 (2/47). 模块源代码中的类与模块所使用
的某依赖库中的类名相同. 模块源代码中实现的类与模块所使用的某依赖库中的类名相同. 在图 A1(a) 对应的
#GJS-8 [89] 中, 模块 gigya-java-sdk 中声明类 org.json.JSONObject, 而这个类同样在其依赖库 json 中存在, 从而导致
模块与依赖库 json 中包含了完全限定名相同的类. 这导致用户在试图使用与 gigya-java-sdk 中版本不同的
JSONObject 时出现 NoSuchMethodError, 最终 gigya-java-sdk 中移除了冲突的类.
这类异味在 Maven 和 Gradle 中皆存在, 产生原因主要是 Java 虚拟机 (JVM) 在提供的路径中发现多个同名类
时, 只会加载其中一个, 并忽略其他类. 这类异味往往不易被察觉, 尤其在构建可执行 Jar 包时, 由于配置文件未将
当前模块自身声明为依赖库, 当遇到冲突类时, Maven 和 Gradle 会优先选择依赖库中的类进行打包, 而忽略当前
模块中声明的类.
2) 类别 1.2 外部类名冲突: 模块的依赖库之间包含完全限定名相同的类 (7/47). 模块所使用的依赖库之间包含
完全限定名相同的类.在图 A1(b) 对应的#IJA-127 [90] 中, 模块引用直接依赖 imgui-java-app 和被其引入的传递依赖
imgui-java-binding, 但 imgui-java-app 在打包时将一系列 imgui-java-binding 中的类也包含在其中, 导致两个依赖库
之间出现了完全限定名相同的类, 最终开发者移除了 imgui-java-binding 中的类解决了类冲突.
这类异味在 Maven 和 Gradle 中皆存在, 产生原因和异味 1.1 相似. 不同之处在于, 这种异味涉及依赖库之间

