AEM 6.5.9服务包升级后Apache Poi调用createWorkbook报NoClassDefFoundError
AEM 6.5.9升级后Apache POI NoClassDefFoundError解决方案
核心根因
AEM 6.5.9 默认预置的commons-compress包版本低于1.17,而你使用的Apache POI版本依赖commons-compress >=1.17版本中的org/apache/commons/compress/utils/InputStreamStatistics类,OSGi类加载机制下优先加载AEM系统预置的低版本包,导致类缺失。
排查思路与解决方案
- 依赖版本冲突核实
登录AEM系统控制台/system/console/depfinder,搜索org.apache.commons.compress.utils.InputStreamStatistics,确认该类是否存在、所属的bundle版本号,同时搜索你部署的POI关联bundle,检查其Import-Package配置中org.apache.commons.compress.utils的版本要求。 - 调整Maven依赖排除冲突
在pom文件中显式排除Uber Jar和POI传递的低版本commons-compress,同时引入匹配POI版本要求的commons-compress依赖:<!-- 显式引入符合POI要求的commons-compress版本 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version> <!-- 可根据POI版本要求调整为对应最低兼容版本 --> </dependency> <!-- Apache POI依赖配置 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>你当前使用的POI版本号</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>你当前使用的POI版本号</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> </exclusion> </exclusions> </dependency> - 配置OSGi bundle类加载优先级
在maven-bundle-plugin的配置中添加嵌入指令,将commons-compress包内嵌到你的项目bundle中,同时配置禁止导入外部的compress工具类,优先使用内部嵌入版本:<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Embed-Dependency>commons-compress;inline=true</Embed-Dependency> <Import-Package> !org.apache.commons.compress.utils.*, * </Import-Package> </instructions> </configuration> </plugin> - 全局替代方案
如果项目多模块都依赖POI相关功能,可直接在AEM实例中单独安装高版本commons-compress的OSGi bundle,上传至/system/console/bundles并启动,该方案可一次性解决全实例的类缺失问题。
内容的提问来源于stack exchange,提问作者ChengYee
相关产品推荐
相关产品推荐

