com.jcraft.jsch.JSchException: java.io.FileNotFoundException: file:D:developmentideaProjectssalary-card argetsalary-card-0.0.1-SNAPSHOT.jar!BOOT-INFclasses!keystorelogin_id_rsa 资源未找到

com.jcraft.jsch.JSchException: java.io.FileNotFoundException: file:D:developmentideaProjectssalary-card argetsalary-card-0.0.1-SNAPSHOT.jar!BOOT-INFclasses!keystorelogin_id_rsa (文件名、目录名或卷标语法不正确。)

Caused by: java.io.FileNotFoundException: file:D:developmentideaProjectssalary-card argetsalary-card-0.0.1-SNAPSHOT.jar!BOOT-INFclasses!keystorelogin_id_rsa (文件名、目录名或卷标语法不正确。)

问题:

  资源未获取到,开发环境没问题,测试环境有问题;

原因:

  经排查,发现是因为在打完jar包后运行,jar包中无法获取对应目录的资源文件;

  这主要是因为jar包是一个单独的文件而不是文件夹,不能通过“file:D:developmentideaProjectssalary-card argetsalary-card-0.0.1-SNAPSHOT.jar!BOOT-INFclasses!keystorelogin_id_rsa”定位jar包内的资源。

解决:

  所以综上所述,我们在通过jar包来访问的话,不要使用getResource或getFile方法来访问了,使用resource.getInputStream() getResourceAsStream()方法,通过流的形式来访问资源是可以的;

  例:

InputStream is=this.getClass().getResourceAsStream("keystore/login_id_rsa"); 
BufferedReader br
=new BufferedReader(new InputStreamReader(is));
String s
="";
while((s=br.readLine())!=null)
  System.out.println(s);

  

Resource resource = new ClassPathResource("keystore/login_id_rsa");
InputStream inputStream = resource.getInputStream();
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = inputStream.read(buff, 0, 100)) > 0) {
       swapStream.write(buff, 0, rc);
}
原文地址:https://www.cnblogs.com/lfalex0831/p/9638887.html