日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gradle下bug修正后问题仍存在解决思路

發布時間:2025/3/11 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的java代碼 System.out.println("str");

我的操作心路
這個bug簡單,就是不小心加了雙引號,導致直接打印了字符串str。修正!我用的是gradle管理項目,進行了clean、build、rebuild project后,繼續使用兩個命令行窗口進行測試。

我的心里路程
問題沒有得到解決。我想想會是什么原因呢?明明已經改過來了。該怎么解決呢?我或許可以嘗試到idea里打斷點進行調試,看看是不是有其他代碼問題。

我的操作心路
說干就干,在idea里配置兩個tomcat試試,學習了tomcat的熱加載配置。

熱加載配置

找到tomcat的目錄下找到conf/server.xml文件,打開,
在host節點下增加Context節點。

<Host name="localhost"... ... <Context path="項目路徑" docBase="/【某目錄名】" debug="0" privileged="true" reloadable="true"/> ... </Host>

屬性概念:

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熱加載后,問題得倒了解決。

我的心里路程
推測兩種可能:

  • reloadable="true"可以對out目錄下的class文件修正。
  • 或者熱加載使用的是build目錄下的class文件。
    有待考證*2
    標記:學習下gradle的目錄結構或源網站的說明。
  • 考證*1
    我的考證結果:有待考證*1處思考有誤。
    我的考證思路:
    在Server.java中添加打印語句,觀察兩處class文件是否添加該打印語句進行來驗證。

    兩種build驗證:

  • idea上方導航欄build(clean project、build project、rebuild project)
  • idea窗口右側邊欄Gradle-Tasks下build(clean、build)
  • 第一種build下:針對的是out目錄下的class
    Server.java修改后,

  • 若未進行clean project,則build project和rebuild project都未能修正out目錄下的Server.class。
  • 若先進行了clean project,則build project和rebuild project都能修正out目錄下的Server.class。
  • 第二種build下:針對的是build/classes/java/main目錄下的class
    Server.java修改后,

  • clean直接會刪除build/classes/java/main整個目錄和Server.class文件。
  • 直接build就可以修正build/classes/java/main目錄下的Server.class文件。
  • 考證*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修正后问题仍存在解决思路的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。