关于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是真的挺坑的,用的时候一定要小心小心再小心。

你可能感兴趣的:(关于NoClassDefFoundError:org/apache/poi/ooxml/POIXMLDocumentPart的触发与解决)