Page 158 - 《软件学报》2025年第7期
P. 158
孙伟杰 等: Java 依赖异味的实证研究与统一检测技术 3079
版本及其中新引入的 java-library 特性, 但本地仅存在 Gradle 3.1 版本而无法进行构建. 在使用构建工具启动器时,
由于项目中仅存在启动器脚本 (gradlew), 而缺少启动器 JAR (gradle-wrapper.jar), 因此无法找到 gradle-wrapper.jar
而导致构建错误.
(a) 危害 1
Gradle 配置 构建错误
gradle-wrapper.properties
项目 pr
由于缺少配置信息, 只得使用本地
项目中使用了 Gradlev4.1 版本 的 Gradle v3.1, 无法获取对应特性
后加入的特性 “java-library”
图 A12 异味 2.1 可能危害与对应触发场景
(a) 危害 1
试图利用 Gradle 封装器
脚本启动 v4.1 版本 调用 wrapper.jar 构建错误
gradle-wrapper.jar
项目 pr Gradle 封装器脚本 gradlew
项目中使用了 Gradlev4.1 本地 Gradle 版本 v3.1
版本后加入的特性 “java-library”
图 A13 异味 2.2 可能危害与对应触发场景
11) 类别 2.3 构建工具启动器 JAR 异常
构建工具启动器 JAR 异常可能造成构建时间增加和构建工具使用时的安全隐患, 以下将详细阐述这些危害
的具体触发场景.
(1) 构建时间增加: 其触发场景为项目构建工具启动器 JAR 版本过旧, 导致性能问题. 以图 A14(a) 为例, 项目
使用的是 Gradle 3.0 版本, 对应的 gradle-wrapper.jar 应该是 3.0 版本, 预期的校验和为 42d7a2, 但实际的校验和为
695 089, 对应于 2.6 版本. 然而, Gradle 2.6 版本存在严重的性能下降问题, 影响了 Gradle 包装器的启动时间, 进而
导致构建时间增加, 而在 3.0 版本中此问题已被修复.
(a) 危害 2
利用 Gradle 封装器
脚本启动 v3.0 版本 调用 wrapper jar
gradle-wrapper.jar
构建成本增加
项目 pr Gradle 封装器脚本 gradlew 冲突
文件的实际校验和 695089 与 v2.6 版本对应校验和吻合 v3.0 版本的预期校验和是 42d7a2
但 v2.6 版本有严重性能问题,
v3.0 版本中此问题被修复
(b) 危害 10
安全隐患
利用 Gradle 封装器 调用 wrapper jar 试图执行危险代码
脚本启动 v3.0 版本
项目 pr Gradle 封装器脚本 gradlew 篡改的 gradle-wrapper.jar
图 A14 异味 2.3 可能危害与对应触发场景
(2) 安全隐患: 其触发场景为项目构建工具启动器 JAR 被篡改. 以图 A14(b) 为例, 项目中的 gradle-wrapper.jar
校验和与任何官方发布的已知版本都不相符. 其被修改并添加了恶意代码, 当开发者试图通过构建工具启动器启
动构建工具时, 可能会导致安全隐患, 例如开发者的信息被窃取等.
12) 类别 2.4 模块间库重复
模块间库重复可能会造成项目维护成本的增加, 其触发场景如下.
(1) 依赖库维护难度增加: 其触发场景为项目对未集中管理的依赖库进行版本升级. 以图 A15(a) 为例, 项目中
的模块 mod1 和 mod2 之间存在同一依赖库 lib 的 1.0.0 版本, 但其版本分别在各自配置文件中进行声明, 而并未进
行统一指定. 在试图将 lib 升级至 2.0.0 版本时, 需要将修改同步至所有模块, 这就导致项目维护成本的增加.

