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,添加内容:
此操作会关闭CDI扫描,可能解决类加载错误,但需测试应用功能是否正常。<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> - 检查系统依赖:CentOS上安装必要的系统库,比如
libfontconfig,执行命令:yum install fontconfig,部分Java UI组件依赖此类系统库。
内容的提问来源于stack exchange,提问作者Hussain Akbar
相关产品推荐
相关产品推荐

