Android集成Apache POI出现类重复定义与ClassNotFoundException如何解决
Android项目Apache POI类重复冲突解决方案
冲突根本原因
你的依赖配置存在多处重复引入:
- 同时引入了
poi-ooxml和poi-ooxml-lite两个功能重叠的包,二者本身都内置了xmlbeans相关类 - 额外手动引入了
xmlbeans-4.0.0.jar,和POI内置的xmlbeans类重复
桌面端Java运行时不会做严格的类唯一性校验,所以可以正常运行,但Android打包阶段会做Dex合并校验,因此会触发类重复定义报错。
修复步骤
步骤1:精简重复依赖
优先删除冗余的jar包引入,二选一保留POI-OOXML相关包,移除手动引入的xmlbeans包,修改后的依赖配置如下:
dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'com.budiyev.android:code-scanner:2.1.0' implementation 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' implementation files('libs\\commons-collections4-4.4.jar') implementation files('libs\\commons-compress-1.20.jar') implementation files('libs\\poi-5.0.0.jar') // poi-ooxml和poi-ooxml-lite二选一即可,不需要同时引入 implementation files('libs\\poi-ooxml-5.0.0.jar') // 移除手动引入的xmlbeans-4.0.0.jar,poi-ooxml已内置对应依赖 implementation 'org.jetbrains:annotations:15.0' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
步骤2:添加冲突排除规则(可选,仅步骤1未生效时使用)
如果调整后仍有类重复报错,可以主动排除POI内置的xmlbeans依赖,全局仅保留一处xmlbeans引入:
implementation(files('libs\\poi-ooxml-5.0.0.jar')) { exclude group: 'org.apache.xmlbeans', module: 'xmlbeans' } // 全局仅保留这一处xmlbeans引入 implementation files('libs\\xmlbeans-4.0.0.jar')
步骤3:添加Android适配配置
POI是桌面端Java库,在Android上运行需要额外添加如下配置避免打包异常:
- 开启MultiDex解决方法数超限问题:
在模块级build.gradle的defaultConfig块中添加multiDexEnabled true,同时引入依赖implementation 'androidx.multidex:multidex:2.0.1' - 添加打包资源过滤规则,避免重复资源冲突:
android { packagingOptions { pickFirst 'org/apache/xmlbeans/**/*' pickFirst 'META-INF/*.xml' pickFirst 'META-INF/*.MF' } }
步骤4:清理重建
修改完配置后依次执行:
- 点击File > Invalidate Caches,勾选清空缓存并重启Android Studio
- 重启后执行Build > Clean Project,再执行Rebuild Project
内容的提问来源于stack exchange,提问作者MSZ
相关产品推荐
相关产品推荐

