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