为何须要对远程jar包进行debug
在现实开发过程当中,生产环境永远比开发环境复杂,若是开发环境没法还原现场问题,就须要开发人员远程调试现场问题,并且有些bug运行在服务器上,隐藏较深,经过日志也排查不出问题,因此能够采用对 jar 包进行远程调试来解决问题。java
采坑经历
最近对一版SSM的旧项目进行了重构,采用spring cloud微服务的形式以分布式开发的模式开发的功能,其中用到了fastDFS,在SSM项目里Fastdfs本地和构建完以后的项目使用过程当中都没有问题,可是在spring boot框架下本地虽然没问题,可是构建完以后调用下载文件的接口的时候提示找不到fastDFS的配置文件。spring
缘由是因为SSM和SpringBoot项目打包构建完以后的形式不同,SSM构建完是war 包,而SpringBoot构建完是jar包,jar包在运行过程当中有些文件不会展开去执行,因此会出现找不到fastDFS配置文件的错误。shell
通过在jar包中不断调试,发现代码走到这里发生了差异,读取文件路径以classLoader().getResourceAsStream(filePath)读取的时候会自动给文件路径加上classPath,因此致使文件路径错误,我在传入的时候文件路径不加classpath前缀就能够了。问题成功解决!(可是在war包中这样执行是没有问题的)浏览器
private static final String URL="fast_client.conf";
// private static final String URL="classpath:fast_client.conf";
环境介绍
一、开发工具 ideaspringboot
二、项目框架 springboot服务器
三、项目管理工具 maven框架
程序打包
从控制台找到jar包的生成路径:socket
在jar包所在路径下打开powershell窗口,输入命令:maven
java -jar .\itoo-exam-question.jar --server.port=8888
看到下面的界面说明打包成功,jar包没有问题:分布式
能够在本地测试一下,在浏览器调用一个接口看是否能有返回内容。
http://127.0.0.1:8013/datum/downExcel/1072112901400514565/%E5%A4%9A%E9%80%89%E9%A2%98
开始调试
参数说明:
Host:输入服务器地址(或电脑ip地址)
Port:客户端请求链接的端口号(自定义)
-
- transport:监听Socket端口链接方式(也可使用dt_shmem共享内存方式,但限于Windows机器,而且服务提供端和调试端只能位于同一台机);
- server:server=y 表示当前调试服务器,=n表示当前的是调试客户端
- suspend:suspend=n表示启动时不中断,通常用于设置主动链接;suspend=y 表示启动时就进入调试模式,通常用于被动链接。
(注意:若是设置为y,它会阻塞程序运行,直到有客户端链接到对应的监听端口,程序才真正开始执行。有时候程序一闪而过,还没来得及在本地加载上代码程序就执行完了,这种状况就可使用suspend参数)
一、在powershell中输入命令启动jar包
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888 .\itoo-exam-question.jar
二、jar包启动完成后在idea中启动刚才建立的remote loca-jar,出现下面的界面说明启动成功。
如今在idea中调试代码就至关于在调试jar包里的代码。
三、能够在powershell中看到打出的日志信息,如今就能够在idea中调试jar里的代码去排查问题了。