Grails 5.x部署至Wildfly和Websphere时出现NoSuchBeanException错误
核心原因
Grails 5.2.0 及以上版本基于 Micronaut 框架重构了部分核心组件,默认会启用 Micronaut 上下文环境,而传统 Java EE 容器(如 Wildfly 24、Websphere 8.5)并未适配 Micronaut 的自动初始化流程,导致依赖的 io.micronaut.context.event.ApplicationEventPublisher<io.micronaut.context.event.StartupEvent> Bean 无法被实例化。而 Grails 5.1.10 及更早版本仍以 Spring Boot 为核心,仅需移除 Tomcat 依赖即可适配 Java EE 容器。
解决方案
1. 禁用 Micronaut 上下文(推荐)
在项目的 application.yml 或 application.groovy 中添加配置,强制 Grails 使用传统 Servlet/Spring 模式运行:
grails: micronaut: enabled: false
该配置会关闭 Micronaut 的核心上下文初始化,避免引入不必要的 Micronaut 依赖组件,同时保持 Grails 原有功能正常运行。
2. 调整 Gradle 依赖排除
保留移除 Tomcat 依赖的操作,同时额外排除 Micronaut 相关的不必要依赖(需确保不影响 Grails 核心功能):
configurations { compileOnly { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } runtimeOnly { exclude group: 'io.micronaut', module: 'micronaut-context' exclude group: 'io.micronaut', module: 'micronaut-events' } }
注意:排除依赖时需测试验证,避免误删 Grails 运行必需的组件。
3. Websphere 8.5 特殊配置
Websphere 8.5 为老旧 Java EE 7 容器,需调整类加载顺序避免类冲突:
在项目 src/main/webapp/WEB-INF 下创建 ibm-web-ext.xml 文件,添加以下配置:
<web-ext xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd" version="1.0"> <class-loader-mode>PARENT_LAST</class-loader-mode> </web-ext>
该配置让应用优先加载自身依赖的类,避免容器自带类与应用依赖冲突。
4. 关于是否为 Grails Bug
此问题属于 Grails 5.2+ 版本在传统 Java EE 容器下的兼容性缺陷,并非核心功能 Bug。Grails 官方在推进 Micronaut 融合时,未完全适配老旧 Java EE 容器的初始化流程。你可以在 Grails GitHub 仓库查看是否有同类问题报告,后续版本可能会修复该兼容性问题。
内容的提问来源于stack exchange,提问作者Parth Bhagat

