Grails 6.2.3生成WAR无法在Tomcat10/11运行,Quartz任务未启动
解决Grails 6.2.3 Quartz任务在Tomcat 11无法运行的问题
1. 替换Quartz为Jakarta兼容版本
Grails 6.x基于Spring Boot 3.x,原生适配Jakarta EE,必须使用Quartz的Jakarta分支版本,替换build.gradle中的Quartz依赖:
implementation 'org.quartz-scheduler:quartz:2.3.2-jakarta' implementation 'org.quartz-scheduler:quartz-jobs:2.3.2-jakarta'
同时移除所有旧的javax相关Quartz依赖,避免API冲突。
2. 清理残留的javax依赖
运行./gradlew dependencies检查依赖树,排除所有javax开头的冲突依赖:
configurations.all { exclude group: 'javax.servlet', module: 'javax.servlet-api' exclude group: 'javax.persistence', module: 'javax.persistence-api' exclude group: 'javax.transaction', module: 'javax.transaction-api' }
3. 修正Quartz任务类与配置
- 确保任务类导入的是
jakarta.*包,例如用jakarta.inject.Singleton代替javax.inject.Singleton,示例任务类:
import grails.plugins.quartz.Job import grails.plugins.quartz.SimpleTrigger import jakarta.inject.Singleton import org.quartz.JobExecutionContext @Singleton class RunJob extends Job { static triggers = { simple name: 'runJobTrigger', startDelay: 1000, repeatInterval: 5000 } void execute(JobExecutionContext context) { println "Current date: ${new Date()}" } }
- 在
application.yml中确认Quartz自动启动配置:
quartz: auto-startup: true properties: org: quartz: scheduler: instanceName: TestAppScheduler instanceId: AUTO threadPool: class: org.quartz.simpl.SimpleThreadPool threadCount: 5 jobStore: class: org.quartz.simpl.RAMJobStore
4. 规范Tomcat部署方式
- Tomcat 11仅支持Jakarta EE WAR包,直接将生成的WAR包放入
webapps目录即可,无需特殊目录。 - 不要部署到Tomcat10的
webapps-javaee目录,该目录用于兼容传统JavaEE(javax)项目,与Grails6.x的Jakarta适配冲突,会导致版本解析异常。
5. 验证部署结果
启动Tomcat11后,查看logs/catalina.out日志,确认是否有Scheduler TestAppScheduler started的启动日志,以及任务执行的日期打印输出。
内容的提问来源于stack exchange,提问作者Komal Prasad
相关产品推荐
相关产品推荐

