【问题标题】:Java EE/OmniFaces: Project Setup - LinkageError using WildFlyJava EE/OmniFaces:项目设置 - 使用 WildFly 的 LinkageError
【发布时间】:2014-05-12 09:42:51
【问题描述】:

尝试将 OmniFaces 集成到 Java EE Web 项目中。

在实现以下简单侦听器方法时,我收到链接错误。我正在使用 WebSphere 应用程序服务器。

这是怎么回事?

public void useCreditCardChanged(javax.faces.event.ValueChangeEvent event) {
    Boolean oldVal = (Boolean) event.getOldValue();
    Boolean newVal = (Boolean) event.getNewValue();
    if (oldVal!=null) {
        this.useCreditCard = newVal;
    }
    FacesContext.getCurrentInstance().renderResponse();
}

和日志文件:

11:25:48.806 S [ConfigureListene  257] Critical error during deployment: : 
java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
at java.lang.Class.forName0(Native Method) [rt.jar:1.7.0_51]
at java.lang.Class.forName(Class.java:270) [rt.jar:1.7.0_51]
at com.sun.faces.util.Util.loadClass(Util.java:325) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:376) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processHandlerClass(FaceletTaglibConfigProcessor.java:427) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTags(FaceletTaglibConfigProcessor.java:378) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTagLibrary(FaceletTaglibConfigProcessor.java:321) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.process(FaceletTaglibConfigProcessor.java:270) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:437) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214) [jsf-impl-2.2.5-jbossorg-3.jar:]
at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:187) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:86)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:71)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]

11:25:48.808 E [ServiceControlle 1955] MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./my-app: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./my-app: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]

Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:216)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:86)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:71)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    ... 3 more

Caused by: java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:273)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:187)
    ... 7 more

Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
    at java.lang.Class.forName0(Native Method) [rt.jar:1.7.0_51]
    at java.lang.Class.forName(Class.java:270) [rt.jar:1.7.0_51]
    at com.sun.faces.util.Util.loadClass(Util.java:325)
    at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:376)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processHandlerClass(FaceletTaglibConfigProcessor.java:427)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTags(FaceletTaglibConfigProcessor.java:378)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTagLibrary(FaceletTaglibConfigProcessor.java:321)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.process(FaceletTaglibConfigProcessor.java:270)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:437)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
    ... 9 more

【问题讨论】:

    标签: jakarta-ee jboss wildfly omnifaces


    【解决方案1】:

    引起:java.lang.RuntimeException:java.lang.RuntimeException:java.lang.LinkageError:接口itable初始化中的加载程序约束冲突:解析方法时“org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/ event/ValueChangeEvent;)V" 当前类 org/omnifaces/taghandler/ValidateUniqueColumn 的类加载器(org/jboss/modules/ModuleClassLoader 的实例)和类加载器(org/jboss/modules/ModuleClassLoader 的实例) interface javax/faces/event/ValueChangeListener 对于签名中使用的类型(Ljavax/faces/event/ValueChangeEvent;)V有不同​​的Class对象

    您在 webapp 的运行时类路径中有多个不同版本的 JSF API 类。在这个特殊问题中,特别是对于 javax.faces.event.ValueChangeEvent 类,在 webapp 的运行时类路径中发现了多个不同的版本。换句话说,webapp 的运行时类路径是脏的。很可能您在 webapp 的 /WEB-INF/lib 中有不属于那里的 JAR,因为应用服务器本身已经将这些库提供了开箱即用,例如 Java EE 和 JSF。

    那么你的问题还有一个奇怪的地方。您在谈论IBM WebSphere 并且您已标记[websphere],但堆栈跟踪中列出的应用服务器特定类清楚地表明它是JBoss WildFly,这是一个完全不同的服务器,但也许可以解释您添加@987654327 的原因@标签也是如此。同样,这是两个完全不同的服务器。知道你在用什么。

    无论如何,探索webapp的/WEB-INF/lib并摆脱appserver本身已经提供的库,例如javaee.jarjsf-api.jar等。

    【讨论】:

    • 首先,非常感谢您的回答和 WildFly 的提示。我们从 Glassfish 切换到 WildFly 并讨论了很多应用服务器。对困惑感到抱歉。嗯,你是对的,正如我在另一篇文章 (goo.gl/GZttN2) 中所解释的那样,我在服务器站点和 EJB 库中都包含了我的 JSF 实现 (jboss-jsf-api_2.2_spec-2.2.5.jar)。如果我不将它添加到我的 EJB 库中,我可以编译但我的 bean 为空,原因是:“类加载错误:从 [Module”deployment.myApp.ear.APPcore.jar 键入 javax.faces.event.ValueChangeEvent: main" from Service Module Loader] 未找到。"
    • 您的业务层 (EJB) 应该没有任何 JSF(和 Servlet)工件。 JSF(和 OmniFaces)不属于业务层,而只属于 Web 层(WAR)。否则,您的业务层无法在其他 Web 层(例如 JAX-RS、Spring MVC 等)上重用。您需要将 JSF 特定代码从 EJB 移动到 WAR,并确保您的任何服务类都没有(间接) 依赖于javax.faces.* 类。
    • 哇,这意味着从这个角度来看,我们的项目设置是完全错误的。识别 Web 层和业务层并不容易,因为 CDI bean 可以很容易地绑定到 Web 层并提供业务逻辑。在这一点上做出了强有力的决定,不是吗?
    • CDI 确实在两个层上都可用。好的,看起来是时候进行一些重构了。首先,javax.faces.*javax.servlet.*javax.el.*属于业务层。业务层应仅提供 JPA @Entity 类、EJB @Stateless@Stateful 等类,如有必要,还应提供一些非事务性业务服务(根本不与 DB 交互的那些,例如网络爬虫,那些确实可以只是@Named)。这些服务反过来在 Web 层的 JSF 托管 bean 中被 @Injected,而这些服务又被 Facelets (XHTML) 文件引用。
    • 非常感谢您的简短解释。现在确实是时候进行一些重构了。即 CDI bean 基本上应该用作 Web 层上的 JSF 托管 bean,并将业务逻辑委托给业务层上的 ejb/cdi 以在它们之间进行强有力的切割,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2021-03-02
    • 2013-01-22
    相关资源
    最近更新 更多