WebSphere服务器无法获取Mojarra的CDI 1.1工具类报错如何解决?
[10/20/21 15:20:38:248 GMT] 0000006e view E Unable to obtain CDI 1.1 utilities for Mojarra
[10/20/21 15:20:38:254 GMT] 0000006e flow E Unable to obtain CDI 1.1 utilities for Mojarra
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
at java.net.URLClassLoader.findClass(URLClassLoader.java:610)
at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:244)
at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:129)
at java.lang.ClassLoader.loadClass(ClassLoader.java:872)
at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62)
at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:607)
at java.lang.ClassLoader.loadClass(ClassLoader.java:872)
该报错的表层提示为Mojarra无法获取CDI 1.1工具类,实际根因为类加载路径中缺失slf4j日志组件的API包,Mojarra的CDI工具类初始化过程中依赖org.slf4j.Logger类,加载失败后触发上层异常。常见触发场景如下:
- 应用未打包slf4j-api依赖,或打包的版本与当前使用的Mojarra版本不兼容
- WebSphere类加载器配置为父类优先模式,应用自带的slf4j包被服务器父类加载器拦截,无法被应用加载
- 服务器全局或共享库中存在版本冲突的slf4j相关包,导致类加载冲突
- 解压应用war包,检查
WEB-INF/lib目录下是否存在slf4j-api.jar,若存在确认其版本是否与Mojarra版本兼容 - 登录WebSphere管理控制台,进入目标应用的
类装入和更新检测配置页,确认类装入器的加载顺序 - 检查服务器配置的共享库,是否存在绑定到当前应用的slf4j相关依赖,核对版本是否匹配
- 依赖缺失场景:在项目构建配置中引入兼容版本的slf4j-api依赖,打包时放入应用的
WEB-INF/lib目录,Maven项目配置示例如下:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency>
- 类加载顺序冲突场景:将应用的类装入器顺序修改为
父类最后,优先加载应用自身携带的依赖包,避免与服务器自带的日志组件产生冲突 - 多应用共用依赖场景:将兼容版本的slf4j-api及对应的日志绑定包配置为WebSphere共享库,绑定到目标应用或服务器级类加载器即可
内容的提问来源于stack exchange,提问作者jyoti shinkar

