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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:16:01