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("文件复制结束");