springboot項目啟動不報錯,但一啟動就斷開連接問題排查實錄
- 2019 年 12 月 13 日
- 筆記
前言
這次的寫文素材來源於同事的一個小項目,這個項目的需求比較簡單,就是實現一個後台定時調度器,定時更新校對數據。因為這個需求實現起來不複雜,同事三下五除二,花了2天左右,就搞完了,但在運行項目的時候,卻發現,啟動是啟動起來了,但是一啟動後,項目連接就自動斷開了,而且控制台也不報任何錯誤。
這到底是個什麼鬼,才導致這種現象的產生呢?請看下文排查實錄
正文
1、項目環境
- 開發環境:window7 (4核+8G內存)
- 使用ide:idea2019.1
- jdk環境:jdk1.8
- 技術選型: springboot2.2,1
2、排查思路
1、啟動類上捕獲異常,並加上日誌,形如下
public static void main(String[] args) { try { SpringApplication.run(SpringbootVueApplication.class,args); } catch (Exception e) { log.error(e.getMessage(),e); } }
然並卵,控制台除了孤零零的顯示
Disconnected from the target VM, address: '127.0.0.1:62020', transport: 'socket'
再無任何讓人振奮不已的異常錯誤信息
2、jar版本問題或者衝突
因為這個項目採用了最新版的springboot,當時同事就懷疑是不是因為版本太高問題,後邊他把版本調低,這次奇蹟會來?恭喜,奇蹟沒來,留下仍然是這句
Disconnected from the target VM, address: '127.0.0.1:62020', transport: 'socket'
3、先注釋掉業務代碼,觀察
因為這個項目需求還是比較簡單,所以業務代碼也不是很多,於是同事就在我的建議下,先注釋掉業務代碼,再觀察一下,然而還是那句
Disconnected from the target VM, address: '127.0.0.1:62020', transport: 'socket'
雷打不動地瞅着你
4、idea問題
後邊沒招了,同事就懷疑是不是idea本身的問題,於是我就讓同事把代碼拷貝給我一份,在我自己的機子跑一下,果不其然,不是idea的問題。那問題是不是沒解了,當然不是,當時的控制台完整的打印信息類似如下
/\ / ___'_ __ _ _(_)_ __ __ _ ( ( )___ | '_ | '_| | '_ / _` | \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |___, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.2.1.RELEASE) 2019-12-06 15:20:38.664 INFO 138596 --- [ main] c.g.lybgeek.SpringbootVueApplication : Starting SpringbootVueApplication on WIN7-linyb1 with PID 138596 (F:springboot-vuetargetclasses started by linyb1 in F:springboot-vue) 2019-12-06 15:20:38.673 INFO 138596 --- [ main] c.g.lybgeek.SpringbootVueApplication : No active profile set, falling back to default profiles: default 2019-12-06 15:20:40.319 INFO 138596 --- [ main] c.g.lybgeek.SpringbootVueApplication : Started SpringbootVueApplication in 2.752 seconds (JVM running for 4.001) Disconnected from the target VM, address: '127.0.0.1:65204', transport: 'socket'
當我看了日誌,我發現該打印日誌裏面缺少了相應的服務端口信息,答案即將水落石出,後邊我就看了一下項目pom.xml,沒有看到spring-boot-starter-web這個jar,於是我就讓同事加web包,然而同事不想加,理由是:這個項目本來就不是web項目,為啥要加這個jar?我就跟他說,加了,項目就可以跑起來,而且也不會斷開。同事將信將疑,就加了,果然項目成功跑起來了。
總結
寫這篇文章的初衷,就是為了記錄一下同事的解決思路,感覺他解決問題的思路還是挺好的,他一上來,先從代碼層抓起,先在可能出問題的代碼層捕獲異常並打日誌,再從版本,最後再是從運行環境問題排查。畢竟運行環境出問題的概率會低於自己代碼出問題的概率。然後有時候日誌沒有任何異常輸出時,還可以考慮查看一下warn級別信息,或者相對敏感點的info級別信息
本文後邊雖然提供了一種解決思路,但是同事最後還是沒採納。因為他始終覺得,jar的依賴要越少越好,只需要依賴必要的包,非必要的jar沒必要引入。他覺得他做的項目本質就是一個普通java項目,並非web項目,引入web包雖然是解決問題,但沒解決本質問題。那這個本質問題是什麼呢?先賣個關子,後邊會寫一篇文章來解答並介紹下如何用springboot搭建一個非web項目