1、问题描述

        最近我碰到了一个问题,我打了jar包以后无法通过文件路径访问resources目录下的文件。

 

 

2、产生原因

        因为通过package打的jar包本身就是一个压缩文件,压缩以后的话,resources目录下的文件的路径就会发生变化了,而且对于压缩文件除非使用专门的解压缩软件,否则你也打不开这个包啊!因此就会造成路径不对无法访问jar包中编译后resources目录下的文件。

 

3、解决方法

        其实很简单,访问resources目录下的文件你就以流的形式去访问。如果想要新建文件,直接在服务器上的某个目录下新建,不要把路径写在resources目录下!

4、我的代码

        引入common IO用于对文件流的操作

 <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.13.0</version>
        </dependency>
//获取resources目录下的文件
@Value("classpath:/logo.png")
private Resource logoResource;    
@Value("classpath:/STSONG.TTF")
private Resource stsongResource;


public File createPDF() throws java.io.IOException {
        //在服务器根目录上新建一个专门的文件夹
        File temp = new File("\\ITextPDFandEasyExcelUtil");
        String path = "";
        if (!temp.exists()) {
            temp.mkdir();
            path = temp.getPath();
        }
        File logoFile = new File(temp.getPath() + "/logo.png");
        File stsongFile = new File(temp.getPath() + "/STSONG.TTF");
        if (!logoFile.exists()) {
            FileUtils.copyInputStreamToFile(logoResource.getInputStream(), logoFile);
        }
        if (!stsongFile.exists()) {
            FileUtils.copyInputStreamToFile(stsongResource.getInputStream(), stsongFile);
        }
......
}

        其实就是先在服务器上的根目录创建一个文件夹再把resources目录下的文件拷贝一份到该文件夹里。

         注意获取文件流,最好用@Value取文件并赋值给Resource,因为如果用File file=new File(xxx)在打成jar包的时候,是会找不到文件的。jar中操作文件一定要以流的形式操作!

5、总结

        其实这是一个很基本的java常识,java中的jar包是压缩包,打包以后原工程项目中的文件路径会发生变化,不能再用工程绝对路径了,一定要用相对路径!也不能用new File(),一定要用流!如果一定要用new File()的话,建议在jar包外新建一个文件夹用于File操作!

6、参考资料

resources目录下文件加载失败,class path resource [***] cannot be resolved to URL because it does not exist_Be_insighted的博客-CSDN博客

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐