在tomcat上部署項目並進行測試,經常會碰到各種問題。在不同的操作系統上部署,對問題的解決也會有一些差異。
1 發現問題
1.1 項目部署
先將項目達成war包,放到tomcat的webapps目錄下,然后啟動tomcat,在瀏覽器中鍵入項目的部署地址,進行訪問,查看效果。
在windows系統中,利用cmd,cd到tomcat安裝目錄,在bin文件夾中使用shutdown.bat和startup.bat進行關閉和啟動tomcat的操作。
在Linux系統中,cd到tomcat的安裝目錄,在bin目錄下,使用./shutdown.sh和./startup.sh命令進行關閉和啟動tomcat的操作。
1.2 查看報錯信息
查看報錯信息,可以分為前端和后端,前端是指瀏覽器端,在瀏覽器端可以直接使用F12查看console的信息,比如報500的錯誤碼,我們就需要到后台查看tomcat的信息。一般情況下,我們在前端進行操作,后端tomcat也會有相應的信息顯示。這里我們重點說一下tomcat信息查看。
在tomcat啟動的時候,伴隨着tomcat的啟動,啟動過程的各種信息也會顯示出來。
在window系統中,我們利用startup.bat啟動tomcat的時候,cmd會自動打開一個窗口,tomcat啟動的信息也會逐條顯示出來,如果沒有什么問題的信息,會定格顯示,如果有異常或者錯誤信息,會有一個Cause by開頭,后面很多信息都會有空格,我們主要看cause by后面的信息,就是引起異常或錯誤的主要原因。
在Linux系統中,我們利用./startup.sh啟動tomcat,不會彈出新窗口來顯示啟動信息,啟動信息會自動保存到日志文件中,啟動tomcat命令輸入之后,我們切換到logs目錄,然后鍵入tail -f catalina.out命令,可以實時查看tomcat的啟動信息,如果有異常或錯誤,顯示的信息也和windows中tomcat信息一樣,以cause by開頭,后面跟着一些信息。
2 解決問題
Tomcat啟動的時候,啟動信息隨着啟動過程在不停的動態顯示,如果沒有什么問題,信息(Info)會正常顯示,如果出現問題我們就會看到cause by,對於cause by后面的信息,我們着重查看第一段信息,即為導致異常或錯誤的直接原因,下面通過幾個調試中的實例來談談解決問題的過程。
2.1 redis問題
Tomcat啟動后,利用瀏覽器訪問,結果報404錯誤,也就程序有問題,沒有正常運行,查看tomcat信息,發現錯誤提示如下。
Caused by: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379 at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1092) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1065) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:865) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:340) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE] at org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration$EnableRedisKeyspaceNotificationsInitializer.afterPropertiesSet(RedisHttpSessionConfiguration.java:302) ~[spring-session-data-redis-2.1.2.RELEASE.jar:2.1.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] ... 29 common frames omitted
其中cause by后面的“org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis;”信息很重要,是導致錯誤的最直接原因。根據信息我們知道是redis連接不上,下面就開始查找redis的問題,首先是配置信息,在application.properties 文件中有關於redis的配置信息,redis服務器信息找到對應的redis服務器,查看redis設置。
比如我們是在windows操作系統中安裝的redis,查看redis配置,主要注意以下幾點,一個是配置文件,對windows系統來說,redis默認的配置文件是redis安裝目錄下的redis.windows-server.conf文件,文件打開后,重點查看兩個地方,一處是訪問ip的顯示,bind 127.0.0.1,前面加#號進行注釋,讓這一句不起作用,因為它的意思是綁定本機ip為127.0.0.1,這樣的話,只能本機訪問,外部是不能訪問的。第二處是protected-mode no,保護模式設置為no,默認是yes。再一個是對防火牆的設置,讓防火牆對redis開放端口。Redis的默認端口是6379,如果防火牆是開啟狀態,可以添加端口規則,讓外部網絡可以訪問6379端口。具體的可以自行百度如何開放防火牆的端口。解決這些設置的問題,一般就可以對redis進行訪問了。
2.2 mybatis問題
在頁面進行登錄的時候,輸入用戶名密碼之后,一直不能登錄,查看后台控制台打印的信息,如下
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
大概意思是根據用戶名密碼,在后台查到兩個結果,不知道是哪一個結果,所以就報錯了,由於是測試階段,用戶很少,直接到數據庫中查看,果然出現了兩個一樣的用戶名密碼,這是個程序的bug,在注冊時候沒有驗證用戶是否已經注冊過,又注冊了一遍,在數據庫中把剛注冊刪除,可以正常登錄。當然,同時,程序也要進行完善。
2.3 文件權限問題
Tomcat啟動過程中,出現異常信息。
java.io.IOException: Unable to create the directory [C:\Program Files\Apache……,
不能在某個目錄下創建目錄,比如tomcat的webapps里面的war包,tomcat啟動時,會將war包解壓,在webapps中創建war包同名的項目目錄,如果權限不夠,就無法創建相應的項目目錄。這個問題解決辦法就是修改目錄的操作權限,比如讓用戶對相應的webapps目錄具有全部的操作權限。如下圖所示。
先在webapps上面點擊右鍵,選擇屬性,然后按照上圖進行順序操作,第四步勾選完全控制,最后應用確定。
3 結語
我們在部署項目到tomcat或其他web應用服務器的過程中,碰到到的各類問題,可以按照控制台信息進行分析,然后找到問題所在,再進行相應的處理。也有的時候,控制台可能沒有太多信息,這就需要分析整個項目的請求相應流程,比如權限問題,如果代碼不夠友好,沒有返回信息,我們就需要在代碼中加入各種請求的響應信息,查看在哪一步沒有響應,把問題定位,這樣就可以有針對性的進行分析。