之前读取模板之类经常遇到此类问题,mark一下
# 问题
常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。
在本地单独运行的时候这些简单的处理当然不会有问题。
但是,把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。
# 工作中
这次遇到是读取模板文件然后调用之前封装的工具类方法来导出文件。
因为这里现成的工具类参数需要的是模板文件的路径和替换的map数据。
//替换模板内容并向文件夹输出文件
XWPFDocument doc = WordExportUtil.exportWord07(srcFilePath, map);
1
2
2
原项目所有的模板文件都是放在resource下的。
# 方案
因为jar包是一个单独的文件而非文件夹
不能通过"file:/e:/.../ResourceJar.jar/resource /xxx.txt"这种形式的文件URL来定位到具体的路径。
所以最初直接使用类加载获取到resource,然后将路径直接作为参数调用。
在本地测试运行是可以的,但是作为jar包部署就不行了。
这里有两种解决方案:
1.将模板文件放在项目外部。
2.通过流来获取文件。
# 解决
最终为了不影响原先其他模板的使用而单独创建模板路径
这里就使用了第二种
//获取资源中的模板
Resource resource = new ClassPathResource("templates/" + exStudentConfig.getZtbda());
InputStream daStream = resource.getStream();
//或者 eg
InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");
//这里需要路径,如果自定义工作流可以自己改写使用
//我这里创建了临时模板文件然后获取路径,在完成导出后将临时文件删除
File ztbda = File.createTempFile("temp", ".docx");
FileUtils.copyInputStreamToFile(daStream, ztbda);
String srcFilePath = ztbda.getPath()
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13