加载在jar文件中的资源

访问jar内部文件,使用`getResourceAsStream`而非`getResource`。

访问jar内部文件,使用getResourceAsStream()而非getResource()

重构了每日统计邮件代码,把原来硬编码在java代码的html模板,改写为mustache模板,并且放置在resources目录。

src\main\resources\stat\star_daily_stat_mail.html

本地idea启动验证功能正常,但是打包jar文件后执行异常:

java.io.FileNotFoundException: file:/home/ubuntu/devops/deploy/prod/medical/medical.jar!/BOOT-INF/classes!/stat/star_daily_stat_mail.html (No such file or directory)

读取文件,使用了Class.javagetResource

    public java.net.URL getResource(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);
    }

还有一个功能相近的getResourceAsStream

     public InputStream getResourceAsStream(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResourceAsStream(name);
        }
        return cl.getResourceAsStream(name);
    }

原来代码使用了getResource()获取URL,再构造File对象读取文件内容。 但是对于jar文件,URL地址不能被File识别。 因此要使用流的方式(getResourceAsStream())访问jar内部的文件。

小结:

  • getResource返回URL对象,由应用转换为File。但是在jar环境不能成功。
  • getResourceAsStream在jar环境/非jar环境都能识别。
Built with Hugo
Theme Stack designed by Jimmy