使用Eclipse Transformer升级Richfaces到Jakarta 10失败求助
问题描述
我正尝试将重度依赖Richfaces的应用部署到EAP 8,后续计划替换Richfaces,但目前需先维持原有功能运行。请问有人成功实现过吗?
我通过maven-shade-plugin合并Richfaces的jar包,再用Eclipse Transformer处理该jar包后,打开包含a4j Output Panel的页面时出现如下错误:
Caused by: jakarta.faces.FacesException: Expression error: Named object org.richfaces.OutputPanel not found.
at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.util.Util.notNullNamedObject(Util.java:480) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.application.applicationimpl.InstanceFactory.createComponentApplyAnnotations(InstanceFactory.java:695) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.application.applicationimpl.InstanceFactory.createComponent(InstanceFactory.java:289) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:438) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:570) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:570) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.faces.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:507) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.faces.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:151) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:139) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:57) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:163) at deployment.svweberv-frontend-2439.0.1-SNAPSHOT.war//org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.faces.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:177) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:139) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:57) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:63) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:166) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:358) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:329) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:69) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:57) at jakarta.faces.impl@4.0.4.redhat-00001//jakarta.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:163) at jakarta.faces.impl@4.0.4.redhat-00001//com.sun.faces.facelets.tag.faces.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:139) at deployment.svweberv-frontend-2439.0.1-SNAPSHOT.war//org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53)
我在旧的Richfaces jar包中找不到org.richfaces.OutputPanel类。
处理后的jar包放在WAR的WEB-INF/lib目录下,且faces-config.xml中未设置metadata-complete="true"。
我不知道该如何解决这个错误,恳请提供思路。
解决思路
- 确认组件类的实际路径:a4j:outputPanel对应的实际类并非
org.richfaces.OutputPanel,在RichFaces中,该组件的类是org.richfaces.component.html.HtmlOutputPanel。错误中出现的类名可能是Transformer处理时的映射错误,或者是组件定义文件(如.taglib.xml)中的配置被错误转换。 - 检查Transformer的转换规则:Eclipse Transformer在将javax转换为jakarta命名空间时,可能误修改了组件的名称映射。需要检查Transformer的配置,确保RichFaces的组件定义文件(比如
a4j.taglib.xml、rich.taglib.xml)中的<component-type>和<component-class>没有被错误替换。 - 验证shade打包的完整性:maven-shade-plugin合并jar包时,可能遗漏了RichFaces的组件配置文件。检查合并后的jar包中是否包含
META-INF/faces-config.xml、相关的.taglib.xml文件,以及这些文件中的组件定义是否正确。 - 手动修复组件映射:如果Transformer处理后组件定义出现错误,可以手动修改处理后的jar包中的.taglib.xml文件,将错误的
<component-type>org.richfaces.OutputPanel</component-type>修正为正确的类型(通常是org.richfaces.component.html.HtmlOutputPanel,具体以原RichFaces版本为准),或者检查组件类型的注册是否正确。 - 排查类加载问题:确保处理后的RichFaces jar包中的类能够被EAP 8正确加载。可以检查EAP的日志,查看是否有类加载失败的信息,或者尝试将未合并的单个RichFaces jar包分别用Transformer处理后放入WEB-INF/lib,替代合并后的jar包,排查是否是shade打包导致的类缺失或冲突。
- 参考EAP迁移文档:Red Hat EAP 8的迁移文档中可能有关于旧JSF组件库迁移的指导,确认是否有针对RichFaces的特殊迁移步骤或兼容性补丁。
内容的提问来源于stack exchange,提问作者dralex81
相关产品推荐
相关产品推荐

