Java 9+环境引入apache.poi模块出现ResolutionException报错的解决方案咨询
问题根因
这个报错是Java 9+ JPMS(Java平台模块系统)的拆分包限制导致的:你使用的POI 3.x版本未适配模块系统,poi.jar和poi.ooxml.jar两个Jar包都包含org.apache.poi.util包,模块系统不允许两个不同的模块公开同一个包,因此启动时抛出解析异常:
Error occurred during initialization of boot layer
java.lang.module.ResolutionException: Module poi contains package org.apache.poi.util, module poi.ooxml exports package org.apache.poi.util to poi
无需构建工具的可用解决方案
- 将依赖放到Classpath而非Modulepath
模块系统对Classpath下的未命名模块没有拆分包限制,直接把两个POI Jar包从Modulepath移到Classpath即可正常运行,是操作成本最低的方案。 - 使用启动参数补丁合并模块
启动Java程序时添加--patch-module参数,将poi-ooxml的内容合并到poi模块中,跳过拆分包检查,示例启动命令如下:
注意把命令里的poi-ooxml版本号替换成你实际使用的版本即可。java --patch-module poi=poi-ooxml-3.15.jar 你的主类全限定名 - 合并两个Jar包(你已验证可行)
分别解压两个POI Jar包到同一个目录,允许重复文件覆盖,再将整个目录重新打包为单个Jar包,将该新Jar添加到Modulepath即可,不存在多模块同包冲突问题。
额外建议
POI 3.x系列已经停止维护多年,后续如果有功能迭代需求,建议升级到POI 4.1.2及以上版本,官方已经完成JPMS适配,原生支持Java 9+模块系统,不会出现这类拆分包冲突。
内容的提问来源于stack exchange,提问作者Nicinic
相关产品推荐
相关产品推荐

