springBoot在IDE运行正常但是生产部署运行直接运行jar报错
前言
最近有个历史项目修改,本地运行都正常,修改完业务BUG以后去部署项目,发现频繁报错读取文件找不到
springBoot项目的classpath
我们在开发过程中经常会有一些配置文件或者模板文件需要放到springboot
的resources目录下
当我们本地需要读取使用这些文件时候想通过classPath
目录位置
修改前代码
public static void modifyXML(String accessToken,String expireTime){
Document doc;
try {
//先收一下这部分就是读取classes资源目录下的文件
ClassPathResource classPathResource = new ClassPathResource("static/frontend/js/video/accesstoken.xml");
//原先作者的目的是想通过创建一个临时文件读取我们的原来的配置文件信息
InputStream inputStream = classPathResource.getInputStream();
File somethingFile = File.createTempFile("accesstoken", ".xml");
try {
FileUtils.copyInputStreamToFile(inputStream, somethingFile);
} finally {
IOUtils.closeQuietly(inputStream);
}
//读取临时文件内容获取文件节点信息替换成变更信息
doc = new SAXReader().read(somethingFile);
Element tokenE=doc.getRootElement().element("accessToken");
tokenE.setText(accessToken);
Element expireTimeE=doc.getRootElement().element("expireTime");
expireTimeE.setText(expireTime);
//fixeme 这里是关键地方我们在IDE运行不会报错但是直接部署运行java -jar xxx.jar以后执行就会报错找不到文件
//fixme 原因是我们的所有classes文件目录都在jar包中它实际类似与zip压缩包,
//fixme 跟普通资源目录不同,我们在IDE运行等于是一个解压后的jar目录是一个普通的资源文件夹
//fixme 使用file file直接去打开Jar包中的文件是不可以的。
File file = classPathResource.getFile();
//FileOutputStream out = new FileOutputStream(file);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileWriter(file),format);
writer.write(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
修改后代码
public static void modifyXML(String accessToken,String expireTime){
Document doc;
try {
String path = "static/frontend/js/video/accesstoken.xml";
//fixme 这个文件转流的方式很多 我就是换个写法用上面的一样无关紧要
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
//这里我直接用流的方式打开资源文件不去创建临时文件
//直接读取资源目录配置文件的内容修改即可无需在创建临时文件
//在读取的xml文件找到对应dom的key替换变更的token信息
doc = new SAXReader().read(inputStream);
Element tokenE=doc.getRootElement().element("accessToken");
tokenE.setText(accessToken);
Element expireTimeE=doc.getRootElement().element("expireTime");
expireTimeE.setText(expireTime);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
classpath是什么
我们在IDE运行项目的时候都是会使用maven打包会生成这个目录
classpth就是值classes目录下面的文件路径
总结
1、们部署项目的时候打成的Jar包内容,无法直接通过FILE 去直接打开读取
2、这就是我们遇到的坑的问题。所以不要在纠结为什么IDE运行可以打成JAR包就报错了,认为程序没有问题。
3、程序一般不会错,如果报错一定是有错的地方,细心去研究修改就可以