使用picocli+picocli-shell-jline3配置Java模块触发未命名模块读包编译错误
问题根因
这是Java模块化体系下的拆分包冲突问题。JLine从3.16版本开始将原本拆分的多个子模块(org.jline.reader、org.jline.console等)合并为单个org.jline模块,而你使用的picocli-shell-jline3:4.6.1依赖的是旧版本拆分的JLine子模块,导致模块路径中同一个包同时存在于多个JAR文件中,触发编译报错。
解决方案
- 方案1:手动排除picocli传递的拆分JLine依赖
修改你的Gradle依赖配置,排除picocli-shell-jline3传递引入的旧版拆分JLine子模块,显式引入合并后的单模块JLine,配置示例如下:
dependencies { implementation 'org.fusesource.jansi:jansi:2.3.4' implementation 'info.picocli:picocli:4.6.1' implementation('info.picocli:picocli-shell-jline3:4.6.1') { exclude group: 'org.jline', module: 'jline-reader' exclude group: 'org.jline', module: 'jline-console' // 若存在其他org.jline前缀的拆分依赖,也统一在此排除 } // 显式引入合并后的单模块JLine,可选择3.16以上的任意稳定版本 implementation 'org.jline:jline:3.22.0' annotationProcessor 'info.picocli:picocli-codegen:4.6.1' }
配置完成后清理项目构建缓存,重新执行编译即可。
方案2:升级picocli到适配版本
将所有picocli相关依赖的版本升级到4.7.0及以上,该版本开始的picocli-shell-jline3已经默认适配合并后的单模块JLine,无需手动排除依赖,直接引入即可正常编译。配置校验
你当前的module-info.java配置无需额外调整,保留requires org.jline;即可满足依赖要求。
内容的提问来源于stack exchange,提问作者stofi
相关产品推荐
相关产品推荐

