Grails默认应用无法部署至Tomcat,数据库配置问题求助
我之前在Grails 3部署到Tomcat 8的时候也碰到过一模一样的问题,本地跑好好的,一打包部署就报这个方言错误,给你几个亲测有效的解决办法:
1. 显式指定Hibernate方言
本地运行时Grails会自动检测嵌入式H2数据库的方言,但部署到外部Tomcat容器时,因为环境加载顺序的问题,Hibernate没法自动获取方言信息。直接在application.yml里强制指定方言就可以解决:
hibernate: dialect: org.hibernate.dialect.H2Dialect
把这段配置加到你的数据源配置下方就行,确保Hibernate不用再自动检测。
2. 确认生产环境的数据源配置正确
Grails默认部署到Tomcat时会使用production环境配置,而create-app生成的默认配置里,production环境可能没有明确设置嵌入式数据库的参数。打开application.yml,检查production环境的数据源配置,确保和development环境一致:
production: dataSource: url: jdbc:h2:mem:prodDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE driverClassName: org.h2.Driver username: sa password: dbCreate: update
这样就能保证生产环境也使用嵌入式H2数据库,不会因为配置缺失导致方言检测失败。
3. 检查H2驱动是否被正确打包到war包
有时候Grails的依赖配置可能在生产环境下没有包含H2驱动,导致war包的WEB-INF/lib目录里没有h2-*.jar文件。打开build.gradle,确保runtime依赖里包含H2:
runtimeOnly 'com.h2database:h2'
这个依赖要确保在所有环境都生效,或者至少在production环境里存在。
4. 指定Grails运行环境
如果上面的方法都不行,可以尝试在Tomcat启动时显式指定Grails的运行环境。修改Debian上Tomcat的/etc/default/tomcat8文件,添加以下参数:
CATALINA_OPTS="$CATALINA_OPTS -Dgrails.env=production"
或者如果你想临时用development环境的配置测试,也可以改成-Dgrails.env=development,不过生产环境还是建议用正确配置的production环境。
内容的提问来源于stack exchange,提问作者timber.auhani

