记java动态加载配置文件不成功的问题

一、问题背景:

在我们之前的项目中,很多数据是配置在application.properteis文件中的,这样很多时候修改了数据后,只需要重启应用,而不需要重新打包编译。
但是近期有一个新的需求,运维希望不仅不用重新打包编译,即便是重启,也要省掉。

二、问题描述:

之所有之前修改了数据后需要重启应用,是因为我们的项目中application.properties文件只会加载一次,然后就放在内存中供程序调用。
那么要实现不重启的思路,很容易就能想到一个,那就是每次需要调用配置文件里的类容的时候,就再加载一次配置文件,代码有很多种,其中一个可以是类似下边这样的:

public void sayAaa(){
Properties pro = new Properties();
String path = this.class.getClassLoader().getResource("aaa.properties").getPath();
try {
	InputStream is = new FileInputStream(path);
	pro.load(is);
	aaa = pro.getProperty("aaa");
	is.close();
	pro.clear();
} catch (IOException e) {
	e.printStackTrace();
}
System.out.println(aaa);
}

按照正常的想法,这样应该是可以实现每次修改了配置文件后,再调用sayAaa方法就打印更改后的数据的,我那个负责这个任务的同事也就是这样做的。
但是当他实际上在eclipse中测试的时候,却发现怎么改,再次调用sayAaa之后都是原来的值,让他一度怀疑代码有问题。

三、问题分析:

实际上,他的这种代码是没问题的,确实可以实现每次调用都再次读取相应的文件。
那么他eclipse中测试却并不能得到想要的结果,这又是怎么回事呢?
原因很简单,那就是他的这个功能实现的过程实际上分了这样几个步骤:
1、写代码,开发阶段;
2、测试,代码编译阶段;
3、测试、代码运行阶段。
这样一分,可能问题就比较清晰了:他在eclipse中改配置文件,实际上改的是开发阶段的文件,在编译前的路径中;而测试时,这个文件会在编译的时候放到编译后的路径中。
代码运行之后,修改了配置文件,然后也重新调用了sayAaa方法,但是调用的是编译后的路径下的文件。
而配置文件修改之后,并没有重新编译过,因此编译后的路径下的文件还是修改之前的那个文件的内容,因此也就出现那种怎么测试都感觉代码没生效的错觉了。

涂宗勋 CSDN认证博客专家 web安全 系统安全 安全架构
【若想不迷路,记得点关注,动动小手指,点点全是福】

6年java工作经验,现居湖北武汉,有过支付、OA、CA、OAUTH2等工作经验,现从事车联网行业。
爱好分享,个人博客blog.tzxcode.cn,微信tuzongxun,qq1160569243,欢迎来撩。
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页