1. 声明
当前内容主要为本人记录使用springboot在webmvc程序且打包成jar后时加载外部配置文件的记录(提供从外部修改程序的机会),主要参考官方文档
主要问题:
- web程序加载配置文件分为jar中的配置文件和jar外面的配置文件
- 修改jar中的配置文件需要使用压缩包方式打开并复制修改后的配置文件进入jar中(需要外部配置和内部配置替换)
- springboot打包后只支持带jar外部的config中的application.properties的加载(通过外部文件控制启动行为),对于其他配置文件不能加载
2. 解决方式
使用FileSystemResource
类加载资源文件
原因:在使用springboot的插件打成jar包后,此时启动路径与idea中的路径发生变化,资源文件描述发生变化,但是user.dir
并没有发生变化
而FileSystemResouce本来就是相对于启动路劲来寻找文件的
3. 测试
1. 创建一个简单的springboot项目并提供一个加载文件的api接口
@RequestMapping(value = "/loadWebResource", method = RequestMethod.GET)
public String loadWebResource(HttpServletRequest request, String fileName) {
// 相对工作目录下面即user.dir
FileSystemResource fileSystemResource = new FileSystemResource(fileName);
File file = fileSystemResource.getFile();
String absolutePath = file.getAbsolutePath();
System.out.println("fileName:" + fileName + ",absolutePath:" + absolutePath);
if (file.exists()) {
try (BufferedReader newBufferedReader = Files.newBufferedReader(file.toPath());) {
String readLine = null;
while ((readLine = newBufferedReader.readLine()) != null) {
System.out.println(readLine);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "ok";
}
将程序打成jar包,然后部署后访问
http://localhost:8086/loadWebResource?fileName=nimbus.log
加载jar同级目录下的资源文间
http://localhost:8086/loadWebResource?fileName=config/nimbus.log
加载jar同级的config文件夹中的文件
4.思考
1.虽然使用该方式可以在jar外部加载配置文件,但是在注入配置文件的时候还是需要额外的配置操作,由于是使用springboot-maven方式打包
2.可以考虑将资源配置文件直接加载到springboot的env中(这个还是需要判断当前的运行环境:是jar或者非jar)
5. 加载配置文件
1. 加载jar中的配置文件
// 在具有@Configuration的类中使用
@PropertySource(value= {"bean.properties"})
@EnableConfigurationProperties(value= {BeanProperties.class})
@ConfigurationProperties(prefix = "bean")
public class BeanProperties {
private String configName;
// 省略get\set
}
启动的时候发现默认就是加载classpath
(jar)中的文件,如果该bean.properties
文件不存在则报错
2. 修改为加载jar同级的配置文件(只需要修改一个部分)
@PropertySource(value= {"file:bean.properties"})
file:bean.properties
此时会使用FileSystemResource,就会加载jar同级的配置文件
所以控制文件加载实际上就只需要一个控制就可以了