欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springboot在jar包外部读取配置文件

程序员文章站 2022-05-02 09:50:19
...

    大家都知道springboot运行web程序都是直接打包成一个jar包然后直接java -jar <jar包路径>就可以跑起来了,但是如果我们需要修改jar包里面的配置文件呢?

1.在源码中修改完再打包一次,然后重新部署;

2.允许jar包运行时去读取jar包外部的配置文件,那么直接修改一下配置文件就重新启动一下就OK;

很明显,第二种方法是比较符合方便定理的;

    那么怎么去读取呢?

1)完全没有框架,使用文件流来读取配置文件(springboot引用了一个底层的自己写的项目);

Properties dataSourceConfig = new Properties();
String absolutePath = new File("").getAbsolutePath(); //获取jar包当前的目录
String filePath = absolutePath + "/db.properties"; // 
filePath = filePath.replace("\\", "/");// 拼好文件路径
File file = new File(filePath); 
InputStream in; // 输入流
if (!file.exists()) {
    in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
} else {
    in = new FileInputStream(file);
}
dataSourceConfig.load(in);//properties文件转为Properties对象
in.close();//关闭输入流

获取到了Properties对象后就可以拿去读配置出来了!

2)使用spring框架

    首先springboot默认会先去jar包同路径下寻找application.properties文件,如果找不到就会去resource下找application.properties文件,这是springboot默认的配置文件加载机制;

    如果你需要修改application.properties的文件名,那么还有一种默认的加载机制;在application.properties文件中指定另外一个配置文件的后缀名

application.properties文件中配置这么一句:

spring.profiles.active: xx

那么springboot还会按先外再内的规则去加载application-xx.properties文件;

或者直接使用其他名称配置:spring.config.name=xx

有或者指定一个目录:spring.config.location=/a/b

springboot加载配置文件的优先级:

    1.加载jar包目录下的/config文件夹

    2.加载jar包目录下的配置文件

    3.加载resource文件夹下的config文件夹

    4.加载resource目录下的

    当需要自定义配置文件的名称时:

1.建一个配置类,然后通过注解@PropertySource来注入

@Component
@ConfigurationProperties(prefix = DataSourceProperties.PREFIX) //指定前缀
@PropertySource(value = {DataSourceProperties.configPath + "datasource-application.properties"})
public class DataSourceProperties implements BeanClassLoaderAware{
    public static final String PREFIX = "spring.datasource";
    public final static String configPath = "classpath:";

    private ClassLoader classLoader;
    private String scanLocation;
    private Integer maxActive;
    private Integer initialSize;
    private Integer maxWait
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
       this.classLoader = classLoader;
    }
    .............
}

2.在启动类中加载配置文件

@Configuration
@ComponentScan("com.liangliang")
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class) // 排除springboot内部的配置
//@EnableTransactionManagement
public class ApplicationServer {

    public static void main(String[] args) throws IOException {
        Properties configInfo = new Properties();
        InputStream in = ApplicationServer.class.getClassLoader().getResourceAsStream("xx.properties");
        configInfo.load(in);
        SpringApplication app = new SpringApplication(ApplicationServer.class);
        app.setDefaultProperties(configInfo);
        app.run(args);
    }
}

注意:springboot默认回去加载spring.datasource开头的数据库连接信息,如果你不需要需要在启动类中使用@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)排除该属性的加载;

转载于:https://my.oschina.net/u/3477913/blog/983235