2017-06-02 79 views
1

我看到一個問題,即我們的Grails 3 Web應用程序在我們成功部署了Grails 2 Web應用程序的EC2實例上未正確啓動。這個相同的Grails 2應用程序已經升級到Grails 3,現在正在引發這個問題。我的Grails部署到Tomcat容器時出了什麼問題?

我正在使用的Grails版本是3.2.4。在EC2實例上使用的Tomcat版本是8.0.20。另外,JVM版本是1.8.0_31。

戰爭文件是使用Grails命令grails package(我不確定是否與其他Grails 3.2.4應用程序使用此命令打包並部署得很好)之間存在差異,然後該文件是隨後的放入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配置。該項目仍使用qa模式正確啓動,具有相同的dataSource屬性。我沒有看到問題出現在Tomcat日誌中。

我也讀了幾次文檔(特別是部署部分),並且確保將spring-boot-starter-tomcat依賴關係的行更改爲build.gradle中的provided "org.springframework.boot:spring-boot-starter-tomcat",因爲我沒有使用嵌入式Tomcat。

在做了一些更多的研究之後,我仍然不確定可能導致此問題的原因。也許有一些與Tomcat不兼容,我忽略了。有沒有人有任何想法?任何幫助將不勝感激。謝謝。

回答

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

0

這是grails v.3.2.4中的一個bug。 https://github.com/grails/grails-core/issues/10377

+0

我看到過這個問題。這看起來像嵌入式Tomcat一樣。一位評論者提到它在WAR部署到Tomcat時有效,但是在爲我部署WAR到Tomcat時似乎失敗了。我也沒有在我的日誌中看到FileNotFoundException。也許我可以嘗試升級Spring Boot。 – Nick

+0

您是否嘗試升級Grails? –

+0

我還沒有嘗試過升級。我們有另一個Grails 3.2。4項目,我們已經成功部署到Tomcat容器,並且我們正在開發的特定項目現在已經在自定義qa模式/環境中進行了端對端測試。當我們在此自定義模式下部署到qa Tomcat容器時,它可以正常工作。因此,我希望現在能夠堅持使用相同的版本,並在生產模式下運行時瞭解正在發生的事情。 – Nick