关于NoClassDefFoundError:org/apache/poi/ooxml/POIXMLDocumentPart的触发与解决

项目背景

项目框架用的springboot,要根据一个word模板生成一个pdf文件,受限于技术和格式问题,最终选择使用POI去实现这个功能。

问题触发

本地跑这个功能没有任何问题,但打包上服务器后,就会报NoClassDefFoundError这个错误

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/ooxml/POIXMLDocumentPart
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    ……

问题解决

一开始以为是打包的问题,依赖没有打包进去之类的,按照教程在pom中增加了相关的打包,但是这个问题始终没有解决。
参考其他答主的答案,说这个可能是POI版本包的问题,将版本更换为3.17之后还是没有解决。(POI的word转pdf是真的坑,能不用尽量不要用)
又有其他参考资料说是可能是包依赖冲突,查看源码的时候,发现doconver这个方法有两个不同的实现


doConvert方法实现

估计是包冲突导致的,看了一下pom然后参考了一下其他人只使用word转pdf功能的时候的pom,删除了一长串的依赖。


删除的依赖

只保留了pdf-age的依赖。
上线之后,发现输出的pdf文件不显示中文,只显示数字内容,应该是字体的问题,在linux服务器上装载了宋体字体后,该问题解决。

总结

NoClassDefFoundError这个问题和ClassNotFoundException不一样,前者一般发生在编译时能找到对应的类,但运行时找不到,后者发生在编译时就找不到对应的类。对于NoClassDefFoundError这个问题除了要考虑依赖没导入,也要考虑依赖冲突的情况。
以及,POI是真的挺坑的,用的时候一定要小心小心再小心。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容