Springboot的war包启动时如何读取外部配置文件
- 解决痛点
由于现在项目的配置是直接从工程里面读取的,所以每次开发,测试,本番环境的war包都必须分开打,为了省去分开打包的环节,所以想改成读取外部配置文件的方式,在不影响同一tomcat中发布的其它项目的前提下,从外部不同的路径读取配置文件,这样一来,不同环境的配置文件都可以根据需要手动修改。
解决方式如下:
<!--打包时去除配置文件-->
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.yml</exclude>
</excludes>
</resource>
</resources>
- 新建EnvironmentPostProcessor的实现类,修改项目配置文件的读取路径
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor{
/**
* 配置文件路径,与tomcat中发布的其它项目的配置文件路径区分开
*/
public static final String PROPERTY_FILE_PATH = "C:\\conf\\application.properties";
/**
* 修改项目配置文件的读取路径
*/
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(PROPERTY_FILE_PATH));
//环境名称随意取,但尽量不能和其他环境名称相同,避免不生效
PropertiesPropertySource propertySource = new PropertiesPropertySource("environmentPostProcessor", properties);
//外部的文件是最先导入的
environment.getPropertySources().addFirst(propertySource);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 在src/main/resources/目录下新建META-INF/spring.factories,使上面的MyEnvironmentPostProcessor 生效
org.springframework.boot.env.EnvironmentPostProcessor=XXX.XXX.config.MyEnvironmentPostProcessor