springboot之classpath本地运行正常直接运行jar报错案例

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、程序一般不会错,如果报错一定是有错的地方,细心去研究修改就可以

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值