使用runtime-name部署WildFly时出现ClassNotFoundException异常
问题描述
部署HA单例应用时,需要用--runtime-name参数指定稳定名称(默认WAR文件名带版本号,会导致新版本生成不同单例,不符合HA需求)。在WildFly 27.0.1中使用以下命令部署:
./jboss-cli.sh --connect --command="deploy MyApp-1.0.0.war --name=MyApp-1.0.0.war --runtime-name=MyApp --force"
当runtime-name与WAR文件名一致(或省略该参数)时,应用正常加载;但runtime-name与WAR文件名不同时,应用无法启动,所有类触发ClassNotFoundException。
错误日志
2024-05-28 15:15:11,201 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit.MyApp.POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit.MyApp.POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "MyApp" at org.jboss.as.server@19.0.1.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:189) at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739) at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701) at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559) at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: java.lang.ClassNotFoundException:com.my.app.server.reports.control.TabControl from [Module "deployment.MyApp" from Service Module Loader] at org.jboss.as.ejb3@27.0.1.Final//org.jboss.as.ejb3.deployment.processors.BusinessViewAnnotationProcessor.getEjbClass(BusinessViewAnnotationProcessor.java:260) at org.jboss.as.ejb3@27.0.1.Final//org.jboss.as.ejb3.deployment.processors.BusinessViewAnnotationProcessor.deploy(BusinessViewAnnotationProcessor.java:89) at org.jboss.as.server@19.0.1.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:182) ... 8 more Caused by: java.lang.ClassNotFoundException:com.my.app.server.reports.control.TabControl from [Module "deployment.MyApp" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:200) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) at org.jboss.as.ejb3@27.0.1.Final//org.jboss.as.ejb3.deployment.processors.BusinessViewAnnotationProcessor.getEjbClass(BusinessViewAnnotationProcessor.java:258) ... 10 more
解决方案及原因分析
- 核心原因:当指定
runtime-name不包含.war后缀时,WildFly会错误识别部署类型,导致类加载器无法正确定位WAR包内的类资源。HA单例要求的稳定名称需要保留WAR后缀。 - 修正部署命令:将
runtime-name设置为MyApp.war,既保持部署类型识别正确,又实现稳定名称的需求:
./jboss-cli.sh --connect --command="deploy MyApp-1.0.0.war --name=MyApp-1.0.0.war --runtime-name=MyApp.war --force"
- 验证逻辑:设置后,部署单元名称为
MyApp.war,HA单例能通过该稳定名称识别实例,同时WildFly正确识别为WAR部署,类加载器可正常加载内部类。
内容的提问来源于stack exchange,提问作者fs-chris
相关产品推荐
相关产品推荐

