升级到Wildfly 24、Java 16后部署war包出现NoClassDefFoundError如何解决?
异常根因
该异常的核心是类加载失败:Weld内置的WeldApplicationFactory类依赖Jakarta Faces规范的jakarta.faces.application.ApplicationFactory类,但服务类加载器无法匹配到符合要求的类,常见触发原因有三类:
- 新旧规范冲突:项目依赖中同时存在旧Java EE的
javax.faces包和新Jakarta EE的jakarta.faces包,类命名空间不匹配导致无法加载 - 依赖scope配置错误:把Wildfly 24已经原生提供的JSF、Weld相关依赖打包到了WAR的
WEB-INF/lib目录下,和服务器内置版本不兼容 - Primefaces版本不匹配:Primefaces 10默认提供的是Java EE(javax)版本,未使用带
jakarta分类器的适配版本,引入了错误的规范依赖
解决方案
- 调整所有Jakarta EE 9规范API的依赖scope为
provided,包括jakarta.faces-api、jakarta.inject-api、jakarta.servlet-api等,避免打包到WAR包中和服务器内置实现冲突 - 修正Primefaces 10的依赖配置,添加jakarta分类器适配Jakarta EE 9规范,Maven配置参考如下:
<dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>10.0.0</version> <classifier>jakarta</classifier> </dependency>
- 执行依赖树排查命令
mvn dependency:tree,排查所有传递依赖中的javax.faces相关旧包,全部添加排除规则 - 打包完成后解压WAR包,确认
WEB-INF/lib目录下不存在jsf-api、javax.faces、weld-servlet等服务器已提供的依赖包 - 若需使用自定义版本的JSF实现,需按照Wildfly模块规范将JSF实现添加为服务器模块,不可直接打包到WAR内,同时在
WEB-INF/jboss-web.xml中指定使用自定义JSF模块
内容的提问来源于stack exchange,提问作者siddy
相关产品推荐
相关产品推荐

