本地正常但预发环境Office开放XML文件MIME类型识别异常排查
排查Tika/POI识别OOXML文件MIME类型异常的方案
既然本地构建的JAR正常,预发构建的JAR拿到本地跑也出问题,那问题肯定出在打包产物的依赖或配置上,和运行环境没关系。
具体排查步骤
- 对比本地和预发的依赖树
执行mvn dependency:tree(Maven项目)或者./gradlew dependencies(Gradle项目),重点盯Tika、POI以及OOXML相关依赖的版本,看预发环境是不是引入了冲突版本,或者漏了必要的解析包。比如Tika 2.x之后得明确引入tika-parsers-standard-package,只引tika-core的话就只会识别成通用的application/x-tika-ooxml。 - 检查打包工具的配置
如果用了Shadow Jar、ProGuard这类打包工具,得确认有没有误删Tika的关键文件:org/apache/tika/mime/mime-types.xml和自定义MIME配置文件META-INF/services下的SPI配置,尤其是org.apache.tika.detect.Detector,里面必须包含org.apache.tika.parser.microsoft.ooxml.OOXMLDetector,不然Tika找不到细分类型的解析器。
- 直接对比JAR包内容
把本地和预发的JAR都解压,对比这几点:META-INF/services/org.apache.tika.detect.Detector的内容是否一致org/apache/tika/mime/下的配置文件是否完整- POI、Tika相关类的版本是否匹配
- 替换依赖版本测试
在预发构建环境里,临时换成本地用的Tika/POI版本重新打包,要是问题解决了,那就是版本兼容的锅。
快速验证代码
要是想快速确认是不是解析器没加载,试试在代码里手动加OOXMLDetector:
TikaConfig config = TikaConfig.getDefaultConfig(); Detector detector = config.getDetector(); if (detector instanceof CompositeDetector) { ((CompositeDetector) detector).addDetector(new OOXMLDetector()); } // 然后执行检测 String mimeType = detector.detect(new TikaInputStream(new File("test.docx")), new Metadata()).toString();
内容的提问来源于stack exchange,提问作者Esphi01
相关产品推荐
相关产品推荐

