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