<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          IDEA 遠程 Debug 及使用場景

          共 2671字,需瀏覽 6分鐘

           ·

          2021-10-03 20:25

          說到遠程Debug這個功能,基本上大多IDE都會自帶,筆者切換到IDEA之后,還真再就沒用過遠程Debug,直到昨天發(fā)現(xiàn)了一個非常基礎(chǔ)的錯誤...

          坑從何來

          坑來自于我的開源小工具, V-Mock.筆者本意是打造一個,簡單,輕巧,一鍵運行的接口模擬系統(tǒng),用來方便等待他人接口的前端后端同學(xué).

          基于以上目的,我使用了嵌入式數(shù)據(jù)庫sqlite,來配合Springboot,構(gòu)造了無須配置,一行啟動的小jar包. 目錄結(jié)構(gòu)如下,數(shù)據(jù)庫直接扔在了Resource中:

          開源后有使用的同學(xué)提了Bug,筆者也是正常操作,改完bug重新打版發(fā)行.

          升級版本的同學(xué),發(fā)現(xiàn)數(shù)據(jù)沒了,筆者暫時給出了方案,嵌入式數(shù)據(jù)庫嘛,把舊jar中的DB文件,覆蓋到新Jar中就好了

          說出這句話的時候,也不能完全賴??瓦特了,畢竟Springboot+Sqlite這種奇葩組合也是為了工具的小巧性,偶爾嘗試的產(chǎn)物.

          事實上稍微想想,db文件和其他資源不一樣,是要頻繁改寫的,當(dāng)然改動的不是jar包中的原始文件.

          直到收到了一個Issues,告訴了筆者DB文件復(fù)制到新jar中并沒有生效.

          筆者也迅速反應(yīng)過來,怎么可能用的jar內(nèi)的DB文件,真實文件不出意外是放在java.io.tmpdir下了.

          java.io.tmpdir的路徑,一般情況下,macos是在$TMPDIR,win則在%temp%.

          筆者也切換到了對應(yīng)的目錄,終于看到了jar運行時真實使用的DB文件:

          但是這個命名方式很奇怪啊,和原本的v-mock.sqlite并不沾邊.

          一路追隨sqlite的jdbc驅(qū)動源碼,找到了org.sqlite.SQLiteConnectionextractResource方法,看到了命名代碼:

          其實看到這已經(jīng)清晰了,源碼中使用了sqlite-jdbc-tmp拼接了原始jar中DB文件的URL類的hashcode作為文件名.

          之所以筆者開發(fā)的時候沒注意到,看看這個方法第一個if判斷就知道了。

          筆者習(xí)慣用IDE中的Springboot或者Application模式直接啟動項目,并不是打包后的啟動方式

          所以當(dāng)Protocolfile而不是jar的情況,直接就使用了target/classes/db/v-mock.sqlite文件,不用生成臨時文件.

          開發(fā)時,DB可視化工具也連接的是target/classes/db/v-mock.sqlite,所以當(dāng)時并沒發(fā)現(xiàn)疑點.

          事實上這是很正常的操作,很多地方的源碼都有判斷是普通web環(huán)境還是以jar運行的,如果有這方面的調(diào)試,要思考你的啟動方式了.

          那么想把斷點打在第一個if之后,看到效果,選擇之一就是可以使用遠程Debug的方式.

          IDEA的遠程Debug

          IDEA的遠程Debug模塊真的是設(shè)計十分貼心,傻瓜操作,命令都生成好了,不知道現(xiàn)在的eclipse版本有沒有這么貼心.

          從configuration中搜索remote模版,點擊右上角的create configuration,就創(chuàng)建好了一個遠程debug啟動方式.

          Debugger mode選擇Attach to remote JVM即可,它還有一個選項是Listen to remote JVM,意如其名嘛,一個是主動附著到啟動的程序,一個是被動監(jiān)聽程序。

          ip和端口不用多說,筆者直接用的本地jar包,所以填了localhost,右邊jdk版本如果使用其他版本的,需要調(diào)一下。

          中間的文本框就是生成好的jvm參數(shù)了,非常人性化了,直接加入啟動命令即可
          java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 v-mock.jar

          可以完全不用管命令什么意思,如果你想知道,筆者也大概解釋一下:

          • -agentlib:jdwp ?最重要的參數(shù),啟動JDWP代理,JDWP全稱就是Java Debug Wire Protocol,官方給的方便調(diào)試的工具.

          • transport=dt_socket ?通過socket方式傳輸數(shù)據(jù),dt八成就是data transfer的縮寫了.

          • server=y ?開啟調(diào)試server端,注意,因為筆者上文選擇的是Attach to remote JVM,所以這里才是y,等待有調(diào)試器Attach過來,如果你選了Listen模式,那么就是反過來的,調(diào)試器是server,這里就是n了.

          • suspend=n 是否掛起,這里設(shè)置為n,也就是說程序正常跑,什么時候需要Attach就去Attach即可,如果設(shè)置為y,程序?qū)却{(diào)試器Attach上才會繼續(xù)執(zhí)行,比如啟動源碼的調(diào)試場景.

          • address=5005 ?調(diào)試端口設(shè)置為5005,當(dāng)然其它端口也可以.

          啟動jar包,再以剛才創(chuàng)建的方式進行debug,期待的斷點位置已經(jīng)成功到達了.

          結(jié)尾

          找到原因后,筆者也順著sqliteJDBC源碼中命名的方式,開發(fā)了一種數(shù)據(jù)遷移的方式,即:自動或手動找到之前版本的數(shù)據(jù)庫文件,復(fù)制一份,以新版本的hashcode命名即可.

          Spring Boot+嵌入式數(shù)據(jù)庫,是個非?!?/span>不正經(jīng)”的組合,但是開發(fā)小工具還是蠻不錯的,如果有遇到同樣數(shù)據(jù)遷移問題的,不妨參考一下筆者的解決方案??


          要Java學(xué)習(xí)完整路線,回復(fù)??路線?

          缺Java入門視頻,回復(fù)?視頻?

          要Java面試經(jīng)驗,回復(fù)??面試?

          缺Java項目,回復(fù):?項目?

          進Java粉絲群:?加群?


          PS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。

          (完)




          加我"微信"?獲取一份 最新Java面試題資料

          請備注:666,不然不通過~


          最近好文


          1、GitHub 近兩萬 Star,可一鍵生成前后端代碼

          2、Spring 官方為什么建議構(gòu)造器注入?

          3、10000 字講清楚 Spring Boot 注解原理

          4、13個優(yōu)秀的 Vue 開源項目及合集推薦

          5、Java項目實戰(zhàn):利用注解 + 反射消除重復(fù)代碼



          最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
          獲取方式:關(guān)注公眾號并回復(fù)?java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
          明天見(??ω??)??
          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品久久久久久妇女6080 | 国产高清免费视频 | 天天视频有没有黄色。 | 欧美三级视频 | wwwxxxx69 |