集成Swagger启动Tomcat时遭遇NoClassDefFoundError错误求助
你在集成Swagger到Spring+CXF项目时碰到的这个运行时错误,我之前也遇到过,先把你提供的错误信息贴出来明确问题:
2018-04-30 14:01:33 ERROR ContextLoader:351 - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productAPIServer': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/apache/cxf/jaxrs/model/doc/DocumentationProvider
这个NoClassDefFoundError本质是编译阶段能找到目标类,但运行时环境里缺失该类,大概率是依赖不全或者版本不兼容导致的,给你几个针对性的解决步骤:
补充CXF JAX-RS文档模块依赖
错误里的DocumentationProvider属于CXF的JAX-RS文档组件,你需要在pom.xml中添加这个依赖,并且要和你当前使用的CXF版本保持完全一致:<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-jaxrs-doc</artifactId> <version>你的CXF版本号</version> </dependency>同时也要确保
cxf-rt-jaxrs和Swagger整合的核心依赖(比如swagger-jaxrs)都已经正确引入,不要遗漏。校验版本兼容性
CXF和Swagger的版本适配很关键,比如如果你用的是CXF 3.x系列,建议搭配swagger-jaxrs1.5.x版本;如果是CXF 2.x,对应的Swagger版本要选择更匹配的旧版本。版本不匹配会导致类结构变化,直接引发找不到类的问题。检查War包依赖是否完整
重启Tomcat前,可以手动解压生成的War包,查看WEB-INF/lib目录下是否存在cxf-rt-jaxrs-doc-xxx.jar文件。如果没有,说明Maven打包时没把这个依赖包含进去,可能是你误把依赖范围设为了provided,或者Maven镜像源的问题导致依赖下载不完整。核对Spring配置类
如果你是用Java配置类初始化Swagger和CXF服务,要确保没有错误引用DocumentationProvider相关类,同时检查配置类是否开启了必要的组件扫描,避免Spring无法正确加载相关Bean。
按照这几步排查下来,应该能解决这个类找不到的问题。
内容的提问来源于stack exchange,提问作者Amar

