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項目