本文主要介紹理想的遠程調(diào)試tomcat,下面一起看看理想的遠程調(diào)試tomcat相關(guān)資訊。
前言昨天看到一個問題結(jié)束后你最想吃什么?
仔細想想,火鍋?燒烤?
看過體重秤后,我 恐怕我只能報名去健身房了。
你以為獲得n斤的時間復雜度是o (2 n),其實是o(1),嗖。
回到正題
說到遠程調(diào)試,基本上大部分idmock.從哪里來的坑
作者 的意圖是建立一個簡單,輕量級和一鍵式界面模擬系統(tǒng),方便前端和后端的學生等人 接口。
基于以上目的,我使用嵌入式數(shù)據(jù)庫sqlite配合springboot,構(gòu)造了一個無需配置即可一行啟動的小jar包。目錄結(jié)構(gòu)如下,數(shù)據(jù)庫直接丟入資源:
開源后有同學提出bug,作者也正常操作。bug修正后,重新發(fā)行。
升級版的同學發(fā)現(xiàn)數(shù)據(jù)不見了,于是作者臨時給了個方案,嵌入數(shù)據(jù)庫,剛好把舊jar里的db文件蓋到新jar里。
(db文件位于jar包中)
當你說這句話時,你可以 不要完全依賴瓦特。畢竟springboot sqlite的這種奇妙組合也是偶爾嘗試工具緊湊性的產(chǎn)物。
其實稍微想一想,db文件和其他資源不一樣,需要經(jīng)常重寫。當然,改變的不是jar包中的原始文件。
直到我收到一個問題,告訴作者將db文件復制到新的jar中沒有 不會生效。
作者也很快反應過來,jar里的db文件怎么可能用?真正的文件不出意外放在了java.io.tmpdir下。
java.io.tmpdir的路徑一般情況下,macos在$tmpdir中,win在%temp%中。
筆者也切換到了相應的目錄,終于看到了jar運行時使用的真實db文件:
但是這種命名很奇怪,和原來的vmock.sqlite沒有任何關(guān)系。
一路跟隨sqlite的jdbc驅(qū)動源代碼,找到org.sqlite.sqliteconnection的extractresource方法,看到命名代碼:
其實很清楚,源代碼是用sqlitejdbctmp拼接原jar中db文件的url類的hashcode作為文件名。我沒有的原因。;我開發(fā)的時候沒注意到,看看這個方法的第一個if判斷就知道了。
我 我習慣在ide中使用springboot或者application模式直接啟動項目,而不是打包后。
所以當協(xié)議是文件而不是jar時,目標/classes/db/vmock。sqlite文件可以直接使用,不需要生成臨時文件。
在開發(fā)時,db可視化工具還連接到target/classes/db/vmock。sqlite,所以當時沒有發(fā)現(xiàn)任何疑問。
其實這是一個正常的操作。在很多地方,源代碼可以判斷是運行在通用的web環(huán)境還是jar中。如果有這方面的調(diào)試,你要想好自己的啟動。
所以如果你想在第一個if后中斷,看看效果,其中一個選項就是使用遠程調(diào)試。
想法和建議遠程調(diào)試;的遠程調(diào)試模塊真的很貼心。傻瓜 的操作和命令都會生成。不知道現(xiàn)在的eclipse版本有沒有這么周到?
從配置中搜索遠程模板,點擊右上角的創(chuàng)建配置,創(chuàng)建遠程調(diào)試啟動模式。
調(diào)試器模式可以選擇附加到遠程jvm,它還有一個遠程jvm的選項,顧名思義,一個是主動附加到啟動的程序,一個是被動。
不用說,ip和端口是本地jar包直接使用的,所以填入了localhost。如果右邊的jdk版本使用其他版本,需要調(diào)整。
中間的文本框是生成的jvm參數(shù),非常人性化。直接在javajarag: jdwp = transport = dt _ socket,server = y,suspend = n,address = 5005vmock.jar中添加啟動命令即可。
你不 根本不用擔心命令的含義。如果你想知道,作者大概會解釋:
ag: jdwp最重要的參數(shù)就是啟動jdwp代理。jdwp的全稱是java debug wire protocol,是給的一個方便的調(diào)試工具。transport=dt_socket通過socket傳輸數(shù)據(jù),dt大概是data transfer的縮寫。server=y開始調(diào)試服務器端。注意,因為作者在上面選擇了attach to remot。e jvm,所以這是y,等待調(diào)試器附加。如果你選擇傾聽模式,情況正好相反。調(diào)試器是server,這里是n,suspend=n是否掛起,這里設(shè)置為n,表示程序正常運行,需要時隨時可以掛接。如果設(shè)置為y,程序會等待調(diào)試器掛接后再繼續(xù)執(zhí)行,比如啟動源代碼的調(diào)試場景。地址=5005,調(diào)試端口設(shè)置為5005,當然也可以使用其他端口。啟動jar包,按照剛才創(chuàng)建的進行調(diào)試,預期的斷點位置已經(jīng)成功到達。
最后找到原因后,作者還根據(jù)sqlitejdbc源代碼中的命名方法開發(fā)了一種數(shù)據(jù)遷移方法。
即自動或手動找到以前版本的數(shù)據(jù)庫文件,復制并以新版本的hashcode命名。
springboot嵌入式數(shù)據(jù)庫是一個非常 不當 組合,但是小玩意開發(fā)的挺好的。如果你遇到同樣的數(shù)據(jù)遷移問題,你不妨參考作者 的解決方案。
了解更多理想的遠程調(diào)試tomcat相關(guān)內(nèi)容請關(guān)注本站點。