我看到一個問題,即我們的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不兼容,我忽略了。有沒有人有任何想法?任何幫助將不勝感激。謝謝。
我看到過這個問題。這看起來像嵌入式Tomcat一樣。一位評論者提到它在WAR部署到Tomcat時有效,但是在爲我部署WAR到Tomcat時似乎失敗了。我也沒有在我的日誌中看到FileNotFoundException。也許我可以嘗試升級Spring Boot。 – Nick
您是否嘗試升級Grails? –
我還沒有嘗試過升級。我們有另一個Grails 3.2。4項目,我們已經成功部署到Tomcat容器,並且我們正在開發的特定項目現在已經在自定義qa模式/環境中進行了端對端測試。當我們在此自定義模式下部署到qa Tomcat容器時,它可以正常工作。因此,我希望現在能夠堅持使用相同的版本,並在生產模式下運行時瞭解正在發生的事情。 – Nick