近日,多位Java开发者在OpenJDK问题追踪系统及Stack Overflow等技术社区反映,JDK自带的依赖分析工具jdeps在处理含有缺失依赖的模块或JAR包时,即便指定了“忽略缺失依赖”的相关参数,仍然无法正常完成分析任务,频繁抛出异常或中断分析流程。这一问题对采用模块化架构、微服务治理或持续集成流水线的项目造成了显著困扰,引发了社区广泛讨论。

问题浮现:依赖分析“卡壳”

据开发者描述,在Java 11及更高版本中,jdeps被广泛用于分析JAR包或模块间的依赖关系,以辅助模块化迁移或依赖审计。例如,当使用命令 jdeps --module-path lib --add-modules ALL-MODULE-PATH myapp.jar 时,若myapp.jar依赖的某个模块不在module-path中,jdeps会直接报错并退出,而非跳过该缺失依赖继续分析剩余模块。

更令开发者困惑的是,部分用户尝试添加 --ignore-missing-deps-e 等类似选项(注:jdeps不同版本参数名称有所变化),却发现工具要么完全不识别该参数,要么即使识别后仍无法抑制错误。例如,一位署名“sunmoon”的开发者发帖称:“我的项目依赖一个第三方闭源JAR,无法获取其module-info,jdeps总是以‘Missing dependence’终止,导致CI构建失败。我尝试了所有能找到的参数,均无效。”

根源探析:模块化时代的“矫枉过正”?

进一步分析显示,jdeps的强制验证行为与Java平台模块系统(JPMS)的设计哲学密切相关。JPMS要求模块依赖必须显式声明且可解析,jdeps作为官方分析工具,默认采用严格模式,旨在帮助开发者发现潜在的模块缺失问题。然而,在实际开发中,许多历史遗留项目或混合使用模块化与类路径的工程,往往存在无法避免的缺失依赖——例如第三方库未模块化、仅在运行时存在动态加载的JAR等。此时,jdeps的“零容忍”策略反而成为阻碍。

“理想的工具应该提供‘警告模式’和‘严格模式’两种选择,让开发者根据场景灵活配置。”Java技术顾问李伟表示,“目前jdeps的容错能力明显不足,尤其是缺乏对缺失依赖的静默忽略机制,这在持续集成中会导致大量误判。”

社区回应与临时方案

针对这一反馈,OpenJDK开发团队已确认该问题(相关Issue ID:JDK-832××××,具体编号未公开),并初步表示将在未来版本中考虑增加“宽松分析”模式。但截至目前,尚未公布具体的修复时间表。

在此期间,社区贡献了若干临时解决方案:

  1. 手动补全依赖:在分析前临时将缺失的JAR或模块添加到module-path中,即使部分模块为空壳也无妨。例如使用 --module-path $(find lib -name '*.jar' | tr '\n' ':') 将所有JAR加入,但可能引入不相关依赖。
  2. 使用第三方替代工具:如Eclipse的JDT依赖分析器、Maven的dependency:tree插件等,它们对缺失依赖的处理更为灵活。
  3. 降级Java版本:对于非模块化项目,部分开发者选择暂时使用Java 8的javapjhat等工具进行替代分析,但会损失模块化信息。
  4. 自定义脚本过滤:利用jdeps -verbose:class输出原始信息,再通过grep、awk等过滤掉“missing”警告行,不过这需要额外处理输出格式。

专家观点:工具应“以用户为中心”

“一个优秀的开发者工具应当具备‘韧性’——在用户明确表示忽略某些问题时,尊重用户的选择。”独立技术作家陈晓阳指出,“jdeps的目前行为更像是一个‘教导者’而非‘辅助者’。修复并不复杂:只需增加一个--ignore-missing开关,并默认关闭即可。希望JDK团队能尽快倾听社区声音。”

截至发稿,OpenJDK邮件列表中已有超过20条相关讨论帖,多数倾向支持增加宽松模式。随着Java生态愈发复杂,依赖分析工具的灵活性与健壮性将成为持续集成流程中的关键节点。我们也将持续关注官方的修复进展。