項目完成了部分功能,需要把項目放到公網上,方便演示討論。本來以為挺簡單的,直接將war包放到騰訊雲服務器tomcat中,結果報錯404,第一次碰到這種情況,於是想辦法解決,花了一天的時間,終於解決了問題,和大家分享一下解決的過程,希望對大家有所幫助。解決的途徑還是靠百度以及參考資料,分析可能的原因,然后不斷測試,直到問題解決。
一 問題描述
項目使用的開發工具是IntelliJ IDEA,運行web項目程序,在本地進行測試,頁面能夠正常打開並且測試結果符合預期。將web項目程序打成了war包,放到局域網服務器的tomcat的webapps目錄中,然后重新啟動服務器的tomcat,再進行程序功能測試,頁面能夠正常打開並且測試結果符合預期。將war包放到騰訊雲服務器的tomcat的webapps目錄中,重新啟動tomcat,再進行測試,發現404錯誤,不能正常定位到程序頁面。
二 問題分析
由於同一個war包在本地和局域網都能正常運行,而在騰訊雲中不能正常運行,所以分析本機、局域網服務器和騰訊雲服務器之間的區別,查找不同點。首先是考慮是不是騰訊雲的安全機制,對於訪問的端口有限制,騰訊雲服務器確實有端口訪問控制,可以設置開放某些常用端口,比如web服務端口(80,443,8080),SSH登錄端口(22),mysql端口(3306)等,端口放開后,問題依然沒有解決。第二考慮是不是jdk,tomcat的版本問題,jdk使用的版本都是jdk8,具體版本有點差別,修改為統一的版本。Tomcat的版本情況類似,也修改為統一的版本。版本統一后,測試,問題依舊存在。第三,考慮操作系統的不同對程序的影響,本地和局域網都是在windows環境中,tomcat啟動時,都能實時看到tomcat的日志信息,有什么問題一目了然。而騰訊雲用的是centos7,linux操作系統,tomcat啟動后,實時日志信息不能看到,也就不知道tomcat在啟動過程中是否發生了錯誤,為了實時查看tomcat的日志信息,在重啟tomcat后,打開日志文件。
三 問題解決
在linux系統,切換到tomcat的bin目錄,依次鍵入
./shutdown.sh
./startup.sh
重啟tomcat,然后切換到tomcat的logs目錄,鍵入
tail -f catalina.out
就可以實時查看tomcat的日志信息,日志信息比較多,不過錯誤信息也是很明顯的,和用開發工具調試的時候碰到的報錯信息類似,很容易發現。報錯信息的開頭,就是如下的一段。
Unable to register MBean [HikariDataSource (null)] with key 'dataSource'; nested exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hikari:name=dataSource,type=HikariDataSource
百度了一下,問題解答定位到了StackOverflow網站,不得不說,StackOverflow上的大牛們確實很熱心,有靠譜的回答,試了試,果然管用。
方法就是在配置文件application.properties中,進行如下設置
spring.jmx.enabled=false
重新生成war包,測試,頁面能夠正常打開,功能也都正常。
四 一些未解決的疑惑
雖然問題解決了,但還是有些疑惑的地方,比如同樣的war包,在windows環境中能夠使用,到了linux環境中報錯,具體原因不是太了解。再有就是報錯的大概意思是不能注冊MBean,解決的辦法就是不注冊,直接將jmx設置為false,雖然項目能夠運行,但不知道具體的影響有哪些。這些問題可能還需要在實踐中摸索。
最后希望對大家調試程序有所幫助,如果有大牛對我提出的疑問,有好的解答,也請不吝賜教。
