SpringBoot复制Jar包中文件

        背景:有一个资源文件需要复制到新的目录,但是这个资源文件已经被其它项目打包成了JAR,并且当前的SpringBoot项目引用了这个JAR包。

        问题:在项目没有打包之前,该资源文件可以正常被访问到,并且可以使用IO复制。但是一旦当前项目打包,放到Linux服务器上后,就不能复制到该资源文件。后来直接在本地windows环境中启动项目,也同样出现该资源文件访问不到的情况。

                   简单说:在开发环境中能读取到别的JAR中的资源文件,但是打成jar包在 linux下运行                     后无法找到文件了。

        原因:在开发环境运行时,会把资源文件编译到 项目\target\classes\static\xxx.docx 目录下,但是打包成jar后,Resource下的文件是存在于jar这个文件里面,在磁盘上是没有真实路径存在的,它是位于jar内部的一个路径。所以通过ResourceUtils.getFile或者this.getClass().getResource("")方法无法正确获取文件。

      我们用压缩软件打开 jar 文件

解决

        使用Spring提供的ClassPathResource类能够读取到那个JAR包中的resources目录下的ffmpeg文件。比如下面的复制业务,通过ClassPathResource类就能读取到该JAR中的文件。

try {
   org.springframework.core.io.ClassPathResource resource =
               new ClassPathResource("ffmpeg/ffmpeg.exe");

   InputStream fis = resource.getInputStream();


   FileOutputStream outputStream = new FileOutputStream(  new File('目标文件路径') );

   org.apache.tomcat.util.http.fileupload.IOUtils.copy(fis, outputStream);
   //一定要关闭,不然复制的文件会报被占用错误
   outputStream.close();

} catch (Exception ex) {
    LOGGER.error("复制文件出错");
    throw new FfmpegException("复制文件出错");
}
LOGGER.info("文件复制结束");

         

posted @ 2022-07-17 12:12  小大宇  阅读(446)  评论(0编辑  收藏  举报