赞
踩
如果项目中需要用到操作文件,文件又放在项目的resource下面,通过
Resource resource = new ClassPathResource("templates/template.pdf");
File file = resource.getFile();
这种方式在编辑器中能成功,但是打成jar包之后就报错了,是因为灵雀云上的容器内部是jar包运行,jar包没有绝对路径,所有报错,下面给出两种解决方案:
将需要操作的文件添加到docker容器中,然后jar包项目从docker容器中读取,容器内部就是一台Linux虚拟机
步骤1:修改Dockerfile文件,例如添加两个excel文件
FROM micserver.node1/base/jdk8:152b16_alpine
VOLUME /tmp
ADD ./elk-0.0.1-SNAPSHOT.jar /app/
ADD ./template.pdf /app/
CMD ["sh", "-c", "java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app/elk-0.0.1-SNAPSHOT.jar ${RUN_ARGS}"]
EXPOSE 9996
其中
ADD ./template.pdf /app/
是将文件添加到容器中,并且放在/app/目录下,代码获取文件的地址是:
/app/template.pdf,并且可以配置到配置中心
checkTemplatePath : /app/template.pdf
再通过
@Value("${checkTemplatePath}")
private String checkTemplatePath;
这种方式获取
File templateFile = new File(checkTemplatePath);
就能获取到要操作的文件了
可以把要操作的文件转化成流,再把流转化成文件,这样也能获取目标文件名,此操作涉及到文件流的转化,打开与关闭
代码如下:
InputStream templateInputStream = getClass() .getClassLoader() .getResourceAsStream(checkTemplatePath); String templateSavePath = fileTempPath + "/template.pdf"; //复制的模板保存地址 FileUtils.copyInputStreamToFile(templateInputStream,new File(templateSavePath)); InputStream ruleInputStream = getClass() .getClassLoader() .getResourceAsStream(checkRulePath); String ruleSavePath = fileTempPath + "/template.pdf"; //复制的规则保存地址 File ruleFile = new File(ruleSavePath); FileUtils.copyInputStreamToFile(ruleInputStream,ruleFile); try{ if (templateInputStream != null){ templateInputStream.close(); } if (ruleInputStream != null){ ruleInputStream.close(); } }catch(Exception e){ e.printStackTrace(); }
这种方案也能达到目的,但需要关闭文件流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。