SpringBoot项目中生成jar包后读取不到resource文件夹下的文件
程序员文章站
2022-04-28 09:10:03
...
前两天写了对医院端提供的接口,接口需要从数据库中主动抽取符合条件的数据,然后将数据替换到resource文件夹下已有的XML模板中,例如模板在resource文件夹的templete文件夹中,模板名称为publicTemplete.xml,刚开始使用了File file = ResourceUtils.getFile("classpath:templates/publicTemplete.xml"),然后将获取到的xml模板通过SAXReader解析成Document文件,在通过Document的asXML方法转换成字符串返回给调用者,代码如下:
private String returnXmlStr() throws FileNotFoundException, UnsupportedEncodingException, IOException {
File file = ResourceUtils.getFile("classpath:templates/publicTemplete.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
return doc.asXML();
}
上述代码在未发布成Jar包前通过eclipse启动springboot项目,是可以使用的,然而等到发布成Jar包后通过java -jar xxx.jar来启动时,控制台就会报异常:class path resource [templates/publicTemplete.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/ydhl/xxx。通过百度发现从Jar包中读取文件需要使用ClassPathResource类的getInputStream()方法来完成,代码如下:
private String returnXmlStr() throws FileNotFoundException, UnsupportedEncodingException, IOException {
//此处如果用File file = Resource.getFile(filePath)会报异常:找不到文件
Resource resource = new ClassPathResource("classpath:templates/publicTemplete.xml");
InputStream is = resource.getInputStream();
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString(StandardCharsets.UTF_8.name());
}
再次通过java -jar xxx.jar启动Jar包,读取成功,特此记录下来,已备查寻和增加印象。