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

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包,读取成功,特此记录下来,已备查寻和增加印象。