起源:juejin.cn/post/6844904071204339725
注释
回到正题
说到近程Debug这个性能,基本上大多IDE都会自带,然而个别状况下还真是很少用,大略是因为...
Just a joke,不要当真
笔者切换到IDEA之后,还真再就没用过近程Debug,直到昨天发现了一个十分根底的谬误...
坑从何来
坑来自于我的开源小工具:
https://gitee.com/vtDev/v-mock
笔者本意是打造一个,简略,笨重,一键运行的接口模拟系统,用来不便期待别人接口的前端后端同学。
基于以上目标,我应用了嵌入式数据库sqlite,来配合Springboot,结构了毋庸配置,一行启动的小jar包. 目录构造如下,数据库间接扔在了Resource中:
开源后有应用的同学提了Bug,笔者也是失常操作,改完bug从新打版发行.
降级版本的同学,发现数据没了,笔者临时给出了计划,嵌入式数据库嘛,把旧jar中的DB文件,笼罩到新Jar中就好了
(DB文件位于jar包中的地位)
说出这句话的时候,也不能齐全赖瓦特了,毕竟Springboot+Sqlite这种奇葩组合也是为了工具的玲珑性,偶然尝试的产物.
Spring Boot 根底就不介绍了,举荐下这个实战教程:
https://github.com/javastacks...
事实上略微想想,db文件和其余资源不一样,是要频繁改写的,当然改变的不是jar包中的原始文件.
直到收到了一个Issues,通知了笔者DB文件复制到新jar中并没有失效.
笔者也迅速反馈过去,怎么可能用的jar内的DB文件,实在文件不出意外是放在java.io.tmpdir下了.
java.io.tmpdir的门路,个别状况下,macos是在$TMPDIR,win则在%temp%.
笔者也切换到了对应的目录,终于看到了jar运行时实在应用的DB文件:
然而这个命名形式很奇怪啊,和本来的v-mock.sqlite并不沾边.
一路追寻sqlite的jdbc驱动源码,找到了org.sqlite.SQLiteConnection
的extractResource
办法,看到了命名代码:
其实看到这曾经清晰了,源码中应用了sqlite-jdbc-tmp拼接了原始jar中DB文件的URL类的hashcode作为文件名.
之所以笔者开发的时候没留神到,看看这个办法第一个if判断就晓得了。
笔者习惯用IDE中的Springboot或者Application模式间接启动我的项目,并不是打包后的启动形式
所以当Protocol
是file
而不是jar
的状况,间接就应用了target/classes/db/v-mock.sqlite
文件,不必生成临时文件.
开发时,DB可视化工具也连贯的是target/classes/db/v-mock.sqlite
,所以过后并没发现疑点.
事实上这是很失常的操作,很多中央的源码都有判断是一般web环境还是以jar运行的,如果有这方面的调试,要思考你的启动形式了.
那么想把断点打在第一个if之后,看到成果,抉择之一就是能够应用近程Debug的形式。
IDEA的近程Debug
IDEA的近程Debug模块真的是设计非常贴心,傻瓜操作,命令都生成好了,不晓得当初的eclipse版本有没有这么贴心.
从configuration中搜寻remote模版,点击右上角的create configuration,就创立好了一个近程debug启动形式.
Debugger mode抉择Attach to remote JVM即可,它还有一个选项是Listen to remote JVM,意如其名嘛,一个是被动附着到启动的程序,一个是被动监听程序。
ip和端口不必多说,笔者间接用的本地jar包,所以填了localhost,左边jdk版本如果应用其余版本的,须要调一下。
两头的文本框就是生成好的jvm参数了,十分人性化了,间接退出启动命令即可java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 v-mock.jar
能够齐全不必管命令什么意思,如果你想晓得,笔者也大略解释一下:
- -agentlib:jdwp 最重要的参数,启动JDWP代理,JDWP全称就是Java Debug Wire Protocol,官网给的不便调试的工具.
- transport=dt_socket 通过socket形式传输数据,dt八成就是data transfer的缩写了.
- server=y 开启调试server端,留神,因为笔者上文抉择的是Attach to remote JVM,所以这里才是y,期待有调试器Attach过去,如果你选了Listen模式,那么就是反过来的,调试器是server,这里就是n了.
- suspend=n 是否挂起,这里设置为n,也就是说程序失常跑,什么时候须要Attach就去Attach即可,如果设置为y,程序将会期待调试器Attach上才会继续执行,比方启动源码的调试场景.
- address=5005 调试端口设置为5005,当然其它端口也能够.
启动jar包,再以方才创立的形式进行debug,期待的断点地位曾经胜利达到了。
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2021最新版)
2.别在再满屏的 if/ else 了,试试策略模式,真香!!
3.卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!