前言
idea远程debugger项目能排查出一些在本地复现不了,但在jar包上或者现场环境中出现的一些问题。作者以一次工作中实际遇到的问题为例,顺带记录下如何用idea远程debugger
jar包中File 文件找不到的异常排查与解决
在一次工作中,我将springboot项目打成jar包,然后就出现了File Not Find的异常。我的代码如下所示
public String getFileContent(Resource resource){
File file = resource.getFile();
try(FileInputStream fis = new FileInputStream(file)){
byte[] bytes = new bytes[fs.available()];
fs.read(bytes);
return new String(bytes);
} catch(Exception e){
...
}
return null;
}
- 造成在本地环境中没问题,但是在jar包环境中出问题的原因大致如下(参考博客传送门):
- 由于本地环境是以相对路径的方式获取目标文件的,所以是没问题的;
- 但打成jar包后,因为jar包是一个单独的文件而非文件夹,所以不能以相对路径或绝对路径来获取jar包中内部的文件。
// 解决方法:以流的方式进行读操作
public String getFileContent(Resource resource){
StringBuilder sb = new StringBuilder();
try(InputStreamReader isr = new InputStreamReader(resource.getInputStream(), StandardCharset.UTF-8)){
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine) != null){
sb.append(line);
}
return sb.toString();
} catch(Exception e){
...
}
return null;
}
远程调试排查
在本地开发环境中,我一直复现不了这个问题。但是一用jar包来启动,就会报文件找不到。这时候我就想通过远程调试jar的方式来排查问题
-
第一步:配置idea远程调试
-
第二步
确保idea所在的网络能ping通目标要debugger的jar包的网络 -
第三步
启动jar包
java -Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8999 -jar ./xxx.jar
然后jar包打印如下图所示,则表示成功监听8999端口,时刻准备被远程调试
-
第四步
选择刚刚配置的remote进行启动
然后控制台打印出这句话,并且一直在运行中。代表成功开启远程调试了。
要注意的是,远程debugger的jar包的classes要跟本地代码的classes一致,否则可能会由于代码不一致而无法调试。