我的Grails部署到Tomcat容器有什么问题?

时间:2017-06-02 19:14:21

标签: tomcat grails amazon-ec2

我发现我的Grails 3 Web应用程序无法在我们已成功部署Grails 2 Web应用程序的EC2实例上正确启动的问题。同样的Grails 2应用程序已升级到Grails 3,现在正在引发此问题。

我使用的Grails版本是3.2.4。在EC2实例上使用的Tomcat版本是8.0.20。此外,JVM版本为1.8.0_31。

war文件是使用Grails命令grails package构建的(我不确定这与其他Grails 3.2.4应用程序包和部署之间是否存在差异grails war使用此命令就好了,然后将该文件放入Tomcat webapps目录。

这是我在启动Tomcat时遇到的问题:

Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsCacheFilter': Cannot create inner bean '(inner bean)#2fb114b8' of type [grails.plugin.cache.web.filter.simple.MemoryPageFragmentCachingFilter] while setting bean property 'filter'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '(inner bean)#2fb114b8': Unsatisfied dependency expressed through method 'setUrlMappingsHandlerMapping' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'urlMappingsHandlerMapping': Unsatisfied dependency expressed through method 'setWebRequestInterceptors' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'openSessionInViewInterceptor': Cannot resolve reference to bean 'hibernateDatastore' while setting bean property 'hibernateDatastore'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.NullPointerException

当我仅使用生产模式打包,部署和启动应用程序时会发生这种情况。我尝试在本地的Tomcat 8容器中设置项目,在另一个EC2实例上以qa模式设置项目,并且在我从我尝试部署的生产实例制作的映像启动的EC2实例上以qa模式启动至。我无法重现这些问题。

我认为application.groovy生产环境块中的dataSource可能导致了问题。由于这个特定的项目并不依赖于数据库,我尝试在生产实例上以生产模式再次删除并部署Web应用程序,但我仍面临同样的问题。

我还尝试在qa模式下复制生产dataSource配置。项目仍然使用具有相同dataSource属性的qa模式正确启动。我没有看到问题出现在Tomcat日志中。

我还阅读了几次文档(特别是部署部分),并确保在build.gradle中将spring-boot-starter-tomcat依赖项的行更改为provided "org.springframework.boot:spring-boot-starter-tomcat",因为我没有使用嵌入式Tomcat。

在做了一些研究之后,我仍然不确定导致这个问题的原因。也许我忽略了与Tomcat的一些不兼容性。有没有人有任何想法?任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

问题在于我的应用程序配置和不兼容的插件。 application.yml和application.groovy都包含hibernate块。我还有一个旧版本的插件database-migration(1.4.0)。删除application.yml中的hibernate块并删除database-migration插件后,应用程序已成功部署。如果您想将database-migration插件与Grails 3项目一起使用,则可以使用2.x版本,根据文档:https://github.com/grails-plugins/grails-database-migration#versions

答案 1 :(得分:0)

这是grails v.3.2.4中的错误。 https://github.com/grails/grails-core/issues/10377