欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot项目打成jar包后,无法读取resources下的文件

程序员文章站 2022-04-29 19:01:36
...

最近在使用aspose将word转PDF并进行签章打印,读取凭证文件时遇到一个问题,凭证文件放在resources目录下,Windows下可正常读取,但是打成jar包部署到Linux服务器上却取不到文件。由此问题引出以下思考:

在本地项目读取文件时

this.getClass().getClassLoader().getResource("").getPath()+fileName

this.getClass().getResource("/filename").getPath()

都是可以成功的;

但是jar打包后上面方式读取文件时 会变成 jar!filename 这样的形式去读取文件,这样是读取不到文件的;

可以使用class.getResourceAsStream("/filename") 以流的形式读取文件,是可以读取的到的;

    private static boolean getLicense() {
        boolean result = false;
        try {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            // 凭证文件
            CONFIG_PATH =null;

            //method one(Windows能读到文件,Linux读不到文件)
            URL url = loader.getResource("config/license.xml");
            String filePath = url.getPath();
            logger.info("test-path : " + filePath);
            //test--path : file:/var/qianyue/java/test/qianyue-test.jar!/BOOT-INF/classes!/config/license.xml
            File file = new File(filePath);
            logger.info("test file : " + file.exists());//windows:true,linux:false
            InputStream inputStream1 = CONFIG_PATH == null ? new FileInputStream(file) : new FileInputStream(new File(CONFIG_PATH));

            //method two(Windows能取到文件流,Linux也能取到文件流)
            InputStream flagInputStream = loader.getResourceAsStream("config/license.xml");
            logger.info("test file : " + flagInputStream.available());//windows:1609,linux:1609
            InputStream inputStream2 = CONFIG_PATH == null ? flagInputStream : new FileInputStream(new File(CONFIG_PATH));

            //method three(Windows能取到文件流,Linux也能取到文件流)
            InputStream indexInputStream = loader.getResource("config/license.xml").openStream();//原理与loader.getResourceAsStream一样
            logger.info("test file : " + indexInputStream.available());//windows:1609,linux:1609
            InputStream inputStream3 = CONFIG_PATH == null ? indexInputStream : new FileInputStream(new File(CONFIG_PATH));

            License aposeLic = new License();
            aposeLic.setLicense(inputStream3);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

扩展:

class.getResource()不带"/“时候是从当前类所在包路径去获取资源
class.getResource()带”/"时候是从classpath的根路径获取
class.getResource()本质上也是调用了getClassLoader,只是封装了一层方便了我们使用而已

getClassLoader().getResource("")不带"/“时候是从classpath的根路径获取
getClassLoader().getResource(”/")路径中无法带有"/"

getResourceAsStream() 方法仅仅是获取对应路径文件的输入流,在路径的用法上与getResource()一致