背景

在项目的部署过程中,一般是打成 war 或者 jar 包,这样一般存在两种问题:

  1. 即使是配置文件修改,也还需要整个项目重新打包和部署。
  2. 整个项目只有一套环境,不能切换。

针对上面的问题,可以使用外部化配置来解决。

需求

由于服务器上的应用服务器存放路径未知,只知应用服务器的目录结构。所以需要通过文件的相对路径,实现外部化配置。

环境

  1. JDK6
  2. Spring 3.2.5

方案

File

不建议使用 File 的相对路径来获取,因为以下两点:

  1. File 的相对目录会随着启动的目录变化而变化。
  2. File 不能够获取 jar 包中的配置文件。

Class

可以使用 getClass().getResource 或者 getClass().getResourceAsStream 来获取,可以获取到 jar 包中的文件。

  1. 如果文件路径以“/”开头,表示获取classpath路径下的文件。
  2. 不以“/”开头,获取和当前类同一目录下的文件。

ClassLoader

ClassLoader 和 Class 类似,区别是 ClassLoader 以“/”开头返回null,并且相对路径是获取 classpath 下的文件。

实现

最终选择使用 ClassLoader 来实现较为简单,部分实现。

InputStream is = getClass().getClassLoader().getResourceAsStream(EXTERNAL_CONFIG_FILE);

if (is == null) {
logger.info("外部配置不存在。");
}
try { ResourcePropertySource source = new ResourcePropertySource(new InputStreamResource(is));
// 外部配置优先级最高
beanFactory.getBean(StandardEnvironment.class).getPropertySources().addFirst(source); } catch (IOException e) { logger.error("获取外部配置失败。", e);
}

拓展

如果使用该种方法,出现错误:

xxx has been normalized to [null] which is not valid

则可以参考这里

Spring 加载项目外部配置文件的更多相关文章

  1. spring加载多个配置文件

    首先我们都知道要使用spring,则需要在web.xml中增加如下代码: web.xml: 1:<listener><listener-class>org.springfram ...

  2. spring加载多个配置文件如何配置

    为应用指定多个配置文件: 多个配置文件的关系: 并列 包含 并列关系 即有多个配置文件,需要同时加载这多个配置文件: 可以使用可变参数,数组和统配符进行加载: 可变参数 String config1 ...

  3. Spring加载加密的配置文件

    一.继承并实现自己的属性文件配置器类 /** * 带加密的Spring属性配置文件扩展类 * 加密方式:AES * @author simon * */ public class EncryptPro ...

  4. 【Java Web开发学习】Spring加载外部properties配置文件

    [Java Web开发学习]Spring加载外部properties配置文件 转载:https://www.cnblogs.com/yangchongxing/p/9136505.html 1.声明属 ...

  5. spring加载jar包中多个配置文件(转)

    转自:http://evan0625.iteye.com/blog/1598366 在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <co ...

  6. Spring Boot加载application.properties配置文件顺序规则

    SpringApplication会从以下路径加载所有的application.properties文件: 1.file:./config/(当前目录下的config文件夹) 2.file:./(当前 ...

  7. spring加载属性配置文件内容

    在spring中提供了一个专门加载文件的类PropertyPlaceholderConfigurer,通过这个类我们只需要给定需要加载文件的路径就可以 通过该类加载到项目,但是为了后面在程序中需要使用 ...

  8. spring加载配置文件

    spring加载配置文件 1.把applicationContext.xml直接放在WEB-INF/classes下,spring会采用默认的加载方式2.采用在web.xml中配置ContextLoa ...

  9. spring boot 使用不同的profile来加载不同的配置文件

    在开发过程之中,经常需要在开发和测试环境中进行互相切换,当切换的同时需要加载相应的配置文件,因此要经常 性的对配置文件进行相应的修改,长此以往感到十分痛苦.如果能针对开发和测试环境分别建两个不同的配置 ...

随机推荐

  1. 转:关于C++ const 的全面总结

    转自:https://www.cnblogs.com/xkfz007/articles/2419518.html    如有侵权请联系博主,立即删除. C++中的const关键字的用法非常灵活,而使用 ...

  2. 自制操作系统-使用16进制文件显示 hello world

    1.下载qemu: https://www.cnblogs.com/sea-stream/p/10849382.html 2.制作软盘镜像 使用010editor,新建文件 图2 另保存为cherry ...

  3. JavaWeb_(Spring框架)注解配置

    系列博文 JavaWeb_(Spring框架)xml配置文件  传送门 JavaWeb_(Spring框架)注解配置 传送门 Spring注解配置 a)导包和约束:基本包.aop包+context约束 ...

  4. Flutter移动电商实战 --(25)列表页_使用Provide控制子类-1

    主要是二级分类的UI布局 生成我们的右侧动态类 定义list变量 开始写里面的子项,把每一个小的写了 再拼成一个大的 这样我们的小类就写完了 开始写我的大类别:是一个横向的ListView.写横向的L ...

  5. TensorFlow Object Detection API —— 制作自己的模型

    https://blog.csdn.net/qq_24474463/article/details/81530900 (t20190518) luo@luo-All-Series:~/MyFile/T ...

  6. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_01-vuejs研究-vuejs介绍

    1.vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计 为可以自底向上逐层应用.Vue 的核心库只关注视 ...

  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_12-webpack研究-webpack安装

    npm默认安装配置的路径配置在nodejs的node_modules目录 j加上 -g 就是全局安装 后面只写webpack默认安装的是最新版本 指定版本号 视频中建议指定版本号进行安装

  8. java.lang.IllegalStateException: No primary or default constructor found for class java.time.LocalDate

    转载自:https://blog.csdn.net/Coder_Arley/article/details/81910705 springboot中报错如下: springmvc也可以使用类似处理方法 ...

  9. glide包管理工具

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  10. webdriver(chrome无头浏览器)

    '''chrome无头浏览器''' from selenium.webdriver.chrome.options import Options # 导入相应的类 from selenium impor ...