如何在 Tomcat 7 上部署 Grails 3 应用程序?

Posted

技术标签:

【中文标题】如何在 Tomcat 7 上部署 Grails 3 应用程序?【英文标题】:How can I deploy a Grails 3 app on Tomcat 7? 【发布时间】:2017-02-27 17:21:00 【问题描述】:

我有一个 Grails 应用程序,我想将它部署到一个 tomcat 实例。正在使用的相关库版本:

Grails Version: 3.2.0
Groovy Version: 2.4.7
JVM Version: 1.7.0_79
Tomcat Version: 7.0.39

我建了一个WAR文件(使用grails war),上传到服务器,放到webapp目录下,重启tomcat。 WAR 文件像往常一样被解压,但是当试图访问 webapp 的索引页面时,它只返回错误 404。如果我手动将一个名为“index.html”的文件放在 webapp 的目录中,那么这个文件就会被提供。因此,我得出结论,tomcat 根本没有启动该应用程序。

我试图检查日志是否有错误,但 catalina.out 几乎是空的。重新部署我的 webapp 会产生以下日志输出:

INFO: Reloading Context with name [/myapp] has started
Oct 18, 2016 1:56:30 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/<tomcat-path>/webapps/myapp/WEB-INF/lib/javax.el-api-2.2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
Oct 18, 2016 1:57:43 PM org.apache.catalina.core.ApplicationContext log
INFO: 1 Spring WebApplicationInitializers detected on classpath
Oct 18, 2016 1:57:43 PM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/myapp] is completed

我在那里看不到任何严重错误。我怀疑的一件事是我的项目没有 web.xml 文件,但我读到这是集成在 Grails 3 和 servlet 容器 > 3.0 版不再需要 web.xml(tomcat 7 支持 servlet 版本 3.0)。我尝试过的事情:

在服务器上以独立模式启动应用程序(使用java -Dgrails.env=prod -jar myapp.war)。这工作得很好,我可以在端口 8080 上本地访问它(我不能从远程尝试它,因为只有我真正想要部署到的 tomcat 实例才允许通过防火墙)。 应用 grails 官方文档 (http://docs.grails.org/latest/guide/deployment.html) 中的建议:将依赖项 org.springframework.boot:spring-boot-starter-tomcat 的范围设置为 providedbuild.gradle中的tomcat版本设置为ext['tomcat.version'] = '7.0.72'(按照官方文档的建议。我不能使用与服务器上的tomcat完全相同的版本(7.0.39),因为某些库不可用这个版本在 Maven Central 上。

所有尝试都没有任何效果。我非常感谢任何提示、进一步的调试技巧或我可能忽略的事情。

提前致谢!

【问题讨论】:

【参考方案1】:

这是一个 Grails 错误,将在今天发布的 3.2.1 中修复。 3.2.0的解决方法见以下命令:

https://github.com/grails/grails-core/issues/10196#issuecomment-251155196

【讨论】:

以上是关于如何在 Tomcat 7 上部署 Grails 3 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个 Tomcat + Apache 上部署多个 Grails 应用程序?

Grails项目BuildConfig.groovy Tomcat插件版本?

在现有站点上使用 Tomcat 部署 Grails 应用程序

在 tomcat 上部署 grails 应用程序时创建名为“transactionManagerPostProcessor”的 bean 时出错

Grails 部署问题(WAR 和 Tomcat)

Tomcat 7 中的内存泄漏 Grails 应用程序