OmniFaces 3.0与MyFaces 2.2.12在JBoss Fuse初始化报错排查
问题诊断与解决方案
咱们一步步拆解你的问题——这几乎可以确定是OmniFaces 3.0和MyFaces 2.2.12的版本兼容性冲突,再加上Karaf的OSGi类加载特性放大了问题,具体分析和解决办法如下:
1. 核心原因:版本不匹配
OmniFaces 3.0明确要求依赖JSF 2.3规范,而你使用的MyFaces 2.2.12是JSF 2.2的实现。两者在javax.faces.application.ApplicationFactory的构造方法上存在本质差异:
- JSF 2.3新增了
ApplicationFactory(ApplicationFactory)这个装饰器风格的构造方法,用于实现Factory的包装扩展 - MyFaces 2.2.12作为JSF 2.2实现,根本没有这个构造方法
当OmniFaces 3.0尝试实例化自己的ApplicationFactory装饰类时,会调用父类这个不存在的构造方法,直接抛出你看到的java.lang.NoSuchMethodError——这就是所有异常的根源。
2. Pax Extender的异常是连锁反应
你遇到的MalformedParameterizedTypeException其实是前面InvocationTargetException引发的次生问题:类加载过程被中断后,容器无法正确解析参数化类型,等核心版本冲突解决后,这个异常会自动消失。
3. 可行的解决方案
结合你的环境(JBoss Fuse 6.3 Karaf + MyFaces 2.2.12 + PrimeFaces 6.1),有两种靠谱选择:
- 降级OmniFaces到兼容版本:选择OmniFaces 2.x系列(2.7.x是最后支持JSF 2.2的版本),这个版本完全适配MyFaces 2.2,和PrimeFaces 6.1也能完美配合,这是最快、风险最低的方案
- 升级MyFaces到JSF 2.3版本:如果业务允许,可将MyFaces升级到2.3.x系列(比如2.3.10),这样就能适配OmniFaces 3.0,但要注意:
- 先确认JBoss Fuse 6.3的Karaf环境支持JSF 2.3的类加载
- 检查PrimeFaces 6.1对JSF 2.3的兼容性——它对JSF 2.3的支持有限,可能需要同步升级PrimeFaces到6.2及以上版本
4. 类加载的额外检查
如果降级/升级后仍有问题,需确认以下几点:
- 所有JSF相关Bundle(MyFaces、OmniFaces、PrimeFaces)的类加载范围配置正确,避免同一类被多个Bundle重复加载
- 检查Felix Maven Bundle Plugin的
Import-Package配置,确保javax.faces.*包的版本范围与你使用的JSF版本匹配(比如MyFaces 2.2对应javax.faces;version="[2.2,2.3)") - 确认Pax-CDI-Web-Weld的版本与你的JSF、OmniFaces版本兼容,避免CDI集成时的类加载冲突
内容的提问来源于stack exchange,提问作者st.
相关产品推荐
相关产品推荐

