背景说明
当我们使用springboot开发时,有的时候需要打war包在外部tomcat部署,方便运维人员维护,但是修改配置文件后重新打包给运维的时候,又需要修改一些配置这样还是不方便维护。
在网上找了很多例子但是都是针对.properties文件,读取.yml文件会有问题,当我在看关于springboot加载yml文件时发现需要用到其他的类,YamlPropertiesFactoryBean和YamlMapFactoryBean。下面把读取外部.yml配置文件的方法贴出来。
自定义配置类实现EnvironmentPostProcessor接口
- EnvironmentPostProcessor是springboot支持动态读取文件的接口,实现EnvironmentPostProcessor接口覆写postProcessEnvironment方法
- 在postProcessEnvironment方法实现读取外部配置文件
- 使用YamlPropertiesFactoryBean来读取yml配置文件,getObject()方法可以获取Properties
首先我把springboot.yml配置文件放在tomcat目录的conf目录下(可以根据自己需求修改目录)
实现EnvironmentPostProcessor在方法中完成yml配置读取
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
//tomcat路径
String property = System.getProperty("catalina.home");
String path = property + File.separator + "conf" + File.separator + "myapplication.yml";
//Springboot读取yml配置
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new FileSystemResource(path));
MutablePropertySources propertySources = environment.getPropertySources();
propertySources.addFirst(new PropertiesPropertySource("Config", yaml.getObject()));
}
}
在resouces目录下建一个META-INF文件目录,在目录中建一个spring.factories文件,在文件中配置自己实现的动态读取文件类
org.springframework.boot.env.EnvironmentPostProcessor=com.hzone.demo.config.MyEnvironmentPostProcessor
在pom.xml中配置maven打包时移除配置文件
最后tomcat启动,springboot启动会加载datasource配置创建'sqlSessionFactory',正序正常启动就说明这种方式读取yml配置文件没有问题。
正常启动,成功加载到了.yml配置文件。
最后说一下logback.xml配置文件丢到外面直接在.yml配置文件中配置好路径就可以了
参考文章: