gradle下bug修正后问题仍存在解决思路
目錄
- 我的學習過程
- 我的學習心路
- 熱加載配置
- bug問題總結
我的學習過程
前天寫的client-server聊天項目寫完后,今天進行了調試。我用到的是out目錄下的server.class文件和client.class文件。
先后啟動兩個命令行窗口來進行測試的。
使用java server啟動服務端窗口。
再使用java client啟動客戶端窗口。
客戶端發送四次信息
ni hao zhong guo客戶端發給服務端的信息正常情況下,服務端接收后屏幕打印一律顯示了str。
客戶端打印的四次信息
str str str str我的學習心路
客戶端的發送的具體信息,全是str。為什么呢?
我的操作心路
首先是服務端顯示異常,所以定位到server.java的代碼。定位到問題代碼如下:
我的操作心路
這個bug簡單,就是不小心加了雙引號,導致直接打印了字符串str。修正!我用的是gradle管理項目,進行了clean、build、rebuild project后,繼續使用兩個命令行窗口進行測試。
我的心里路程
問題沒有得到解決。我想想會是什么原因呢?明明已經改過來了。該怎么解決呢?我或許可以嘗試到idea里打斷點進行調試,看看是不是有其他代碼問題。
我的操作心路
說干就干,在idea里配置兩個tomcat試試,學習了tomcat的熱加載配置。
熱加載配置
找到tomcat的目錄下找到conf/server.xml文件,打開,
在host節點下增加Context節點。
屬性概念:
debug=“0”
debug是設定debug level, 0表示提供最少的信息,9表示提供最多的信息。
privileged=“true”
privileged設置為true的時候,才允許Tomcat的Web應用使用容器內的Servlet。
reloadable=“true”
會讓修改生效,該選項適合調試。
我的心里路程
我發現,上面參數里【某目錄名】是建在webapps目錄下,目錄里面需要放置項目編譯后的class文件和項目的jar包。但是同樣class文件在目錄中存在了2個地方。
一個是out/production/classes目錄下
另一個build/classes/java/main目錄下
我的心里路程
老師的課程用的是out目錄下的class文件,我也是使用out目錄下的,是什么原因導致修正不生效呢?為什么有2個地方的class?
我的操作心路
百度一下看看:推測出,由于每次使用的是out目錄下的class文件,但clean、build、rebuild project并沒有修正out文件下class文件。是每次都不起作用呢?還是一定時間間隔后起作用?有待考證*1
我的操作心路
使用tomcat熱加載后,問題得倒了解決。
我的心里路程
推測兩種可能:
有待考證*2
標記:學習下gradle的目錄結構或源網站的說明。
考證*1
我的考證結果:有待考證*1處思考有誤。
我的考證思路:
在Server.java中添加打印語句,觀察兩處class文件是否添加該打印語句進行來驗證。
兩種build驗證:
第一種build下:針對的是out目錄下的class
Server.java修改后,
第二種build下:針對的是build/classes/java/main目錄下的class
Server.java修改后,
考證*2
我的考證結果:有待考證*2處思考有誤。熱加載使用的是out目錄下的class文件。
我的考證思路:
利用兩種build的不同點使兩處的class文件具備不同的打印語句。觀察運行后窗口的打印語句。
out目錄下的Server.class:
System.out.println("-------bad1----");
build/classes/java/main目錄下的Server.class:
System.out.println("-------bad2----");
Server.java:
System.out.println("-------good----");
啟動tomcat,運行Server.java,窗口打印結果:
-------good----out目錄下的Server.class內打印語句發生變化:
System.out.println("-------good----");
out目錄下的class能修正,是否與reloadable="true"有關呢?
我的心里路程
把reloadable設置false試試。重復上面操作。
結果:不影響out目錄下的class的修正。
百度了解:這個屬性設為true,tomcat服務器在運行狀態下會監視在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動,如果監測到有class文件被更新的,服務器會自動重新加載Web應用。
我的思考
設為false時,第一次啟動tomcat也會調一次監測嗎?或者說服務器重啟了會重新加載更新一次,重啟與這個屬性無關?
設為true時,啟動tomcat,運行Server.java,修改Server.java,保存重新編譯(修正了out目錄下的class)。Server.java并沒有重新加載。啊哦!想錯了。監視的是WEB-INF/classes和WEB-INF/lib目錄下class文件。與out目錄下的class無關。想錯了,哈哈哈。
bug問題總結
我錯在使用的是第二種的clean,針對的是build/classes/java/main目錄下的class。未使用第一種的clean project再build project,針對的是out目錄下的class。
總結
以上是生活随笔為你收集整理的gradle下bug修正后问题仍存在解决思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初探EntityFramework——实
- 下一篇: go数据结构整理