
本文详解 JDK 17.0.8 版本中使用 jlink 构建最小化运行时环境时出现 Duplicate resources 错误的根本原因(模块间配置文件冲突),并提供可立即落地的降级、过滤与替代方案。
本文详解 jdk 17.0.8 版本中使用 jlink 构建最小化运行时环境时出现 duplicate resources: {conf/logging.properties=[java.rmi, java.logging, java.prefs, java.xml]} 错误的根本原因(模块间配置文件冲突),并提供可立即落地的降级、过滤与替代方案。
在 Java 17 模块化构建流程中,jlink 是生成自定义最小 JRE 的核心工具。你通过 jdeps --print-module-deps --recursive 准确识别出应用所需模块(java.base,java.compiler,java.desktop,java.logging,java.rmi),但执行 jlink 时却遭遇资源重复异常:
Error: jdk.tools.jlink.plugin.PluginException: Duplicate resources: {conf/logging.properties=[java.rmi, java.logging, java.prefs, java.xml]}
该错误并非配置失误,而是 JDK 17.0.8 版本中 jlink 的已知回归缺陷:其资源合并逻辑未正确处理多个模块共有的配置文件(如 conf/logging.properties),导致 java.logging、java.rmi、java.prefs 和 java.xml 四个模块均声明了同一路径资源,触发严格校验失败。
✅ 验证结论:问题具有版本特异性。实测表明,Zulu JDK 17.0.3(build 17.0.3+7-LTS)可正常完成相同命令,而 17.0.8(build 17.0.8+7-LTS)必然报错——这已被社区广泛确认为回归(regression),非用户操作错误。
解决方案(三选一,推荐按序尝试)
✅ 方案一:降级至稳定 JDK 17.x 版本(最稳妥)
切换至已验证兼容的 JDK 17.0.3 或 17.0.7(LTS 小版本)。以 Zulu 为例:
# 卸载当前 JDK 17.0.8,安装 Zulu 17.0.3 # Linux/macOS 示例(使用 SDKMAN!) sdk install java 17.0.3-zulu sdk use java 17.0.3-zulu # Windows 可手动下载安装包并调整 JAVA_HOME
然后重试原命令,无需修改任何参数。
⚠️ 方案二:显式排除冲突模块(需谨慎评估依赖)
若必须使用 17.0.8,可尝试移除非必需模块(尤其 java.rmi 和 java.prefs 在纯本地应用中常被误引入):
# 先精简依赖分析(排除 RMI/Preferences) jdeps --ignore-missing-deps --print-module-deps --recursive --exclude "java\.rmi|java\.prefs" modules/*/jar/*.jar # 输出可能变为:java.base,java.compiler,java.desktop,java.logging # 再构建(避免冲突源) jlink --no-header-files --no-man-pages --compress=2 --add-modules java.base,java.compiler,java.desktop,java.logging --output jre
⚠️ 注意:java.desktop 依赖 java.prefs,若应用涉及 Swing/AWT 或系统属性持久化,移除后将引发 NoClassDefFoundError。
? 方案三:升级至 JDK 21+(面向未来)
JDK 21(LTS)已修复此问题,并增强 jlink 的资源去重策略。若项目允许升级:
jlink --no-header-files --no-man-pages --compress=2 --add-modules java.base,java.compiler,java.desktop,java.logging,java.rmi --output jre # ✅ 在 JDK 21.0.4+ 中可成功执行
补充建议:构建前必做检查
- 使用
jdeps --list-deps --recursive your-app.jar替代--print-module-deps,获取更精确的模块依赖树; - 添加
--multi-release base参数提升多版本 JAR 兼容性; - 对于生产环境,始终在 CI 流水线中固化 JDK 版本(如 Maven Toolchains +
maven-compiler-plugin绑定)。
? 总结:
Duplicate resources错误是 JDK 17.0.8 的工具链缺陷,而非模块声明错误。优先选择已验证稳定的 JDK 小版本(17.0.3/17.0.7),或直接跃迁至 JDK 21 LTS,可彻底规避该问题,保障模块化构建的可靠性与可重复性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











