You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows迁移至CentOS7后Payara/Glassfish部署失败:CDI错误缺失ClientBehaviorHolder

问题描述

尝试将Windows Server上运行的无源码应用迁移至CentOS 7虚拟机,该应用在Windows平台的Payara 6上正常运行,但使用原WAR包在CentOS 7的Payara 6(SNAPSHOT版本)和Glassfish 7部署时,均出现以下错误:

CDI deployment failure:javax/faces/component/behavior/ClientBehaviorHolder

对应的server.log完整内容如下:

[2023-02-11T19:56:58.878+0500] [Payara 6.2023.3-SNAPSHOT] [SEVERE] [NCLS-CORE-00026] [javax.enterprise.system.core] [tid: _ThreadID=179 _ThreadName=admin-thread-pool::admin-listener(9)] [timeMillis: 1676127418878] [levelValue: 1000] [[
  Exception during lifecycle processing
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:javax/faces/component/behavior/ClientBehaviorHolder -- javax/faces/component/behavior/ClientBehaviorHolder
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at org.glassfish.web.loader.WebappClassLoader.defineLoadedClass(WebappClassLoader.java:3492)
        at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:1234)
        at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1806)
        at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1684)
        at java.base/java.lang.Class.getEnclosingMethod0(Native Method)
        at java.base/java.lang.Class.hasEnclosingMethodInfo(Class.java:1794)
        at java.base/java.lang.Class.isLocalOrAnonymousClass(Class.java:1790)
        at java.base/java.lang.Class.isAnonymousClass(Class.java:1730)
        at org.jboss.weld.bootstrap.AnnotatedTypeLoader.internalLoadAnnotatedType(AnnotatedTypeLoader.java:92)
        at org.jboss.weld.bootstrap.AnnotatedTypeLoader.loadAnnotatedType(AnnotatedTypeLoader.java:75)
        at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:92)
        at org.jboss.weld.bootstrap.BeanDeployer.addLoadedClasses(BeanDeployer.java:199)
        at org.jboss.weld.bootstrap.BeanDeployment.createClasses(BeanDeployment.java:197)
        at org.jboss.weld.bootstrap.WeldStartup.startInitialization(WeldStartup.java:409)
        at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:80)
        at org.glassfish.weld.WeldDeployer.processApplicationLoaded(WeldDeployer.java:579)
        at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:437)
        at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
        at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:344)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.prepare(ApplicationLifecycle.java:577)
        at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:612)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:556)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:552)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/javax.security.auth.Subject.doAs(Subject.java:365)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:551)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:582)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:574)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/javax.security.auth.Subject.doAs(Subject.java:365)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:573)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1497)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1869)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1755)
        at org.glassfish.admin.rest.utils.ResourceUtil.runCommand(ResourceUtil.java:272)
        at org.glassfish.admin.rest.utils.ResourceUtil.runCommand(ResourceUtil.java:240)
        at org.glassfish.admin.rest.utils.ResourceUtil.runCommand(ResourceUtil.java:294)
        at org.glassfish.admin.rest.resources.TemplateListOfResource.createResource(TemplateListOfResource.java:136)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:134)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:177)
        at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:81)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:260)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:239)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:697)
        at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:367)
        at org.glassfish.admin.rest.adapter.RestAdapter$2.service(RestAdapter.java:335)
        at org.glassfish.admin.rest.adapter.RestAdapter.service(RestAdapter.java:189)
        at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:520)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:217)
        at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:174)
        at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:153)
        at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:196)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:88)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:246)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:178)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:118)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:96)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:51)
        at org.glassfish.grizzly.portunif.PUFilter.handleRead(PUFilter.java:193)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:88)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:246)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:178)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:118)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:96)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:51)
        at org.glassfish.grizzly.portunif.PUFilter.handleRead(PUFilter.java:193)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:88)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:246)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:178)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:118)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:96)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:51)
        at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:510)
        at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:82)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:83)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:101)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:535)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:515)
        at java.base/java.lang.Thread.run(Thread.java:831)
]]

解决方法

  • 统一Java版本:确认Windows上运行Payara的Java版本,在CentOS上安装完全相同的Java版本(Payara 6要求Java 11或更高),避免版本差异导致的类加载问题。
  • 匹配Payara正式版:不要使用SNAPSHOT版本的Payara,下载和Windows上完全一致的Payara 6正式发布版部署,快照版可能存在未修复的兼容性问题。
  • 清理WAR包冲突依赖:解压WAR包,检查WEB-INF/lib目录,如果存在javax.faces.jar、jsf-api.jar或jsf-impl.jar这类JSF相关文件,将其删除,让服务器使用内置的JSF库,避免依赖冲突。
  • 临时禁用CDI:如果应用不依赖CDI功能,在WAR包的WEB-INF目录下创建或修改beans.xml,添加内容:
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
           bean-discovery-mode="none">
    </beans>
    
    此操作会关闭CDI扫描,可能解决类加载错误,但需测试应用功能是否正常。
  • 检查系统依赖:CentOS上安装必要的系统库,比如libfontconfig,执行命令:yum install fontconfig,部分Java UI组件依赖此类系统库。

内容的提问来源于stack exchange,提问作者Hussain Akbar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:05:21