背景

在项目的部署过程中,一般是打成 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

则可以参考这里

最新文章

  1. MySQL碎碎念
  2. 系统弹性概念[TODO]
  3. 基于DDD的.NET开发框架 - ABP依赖注入
  4. ubifs物理存储
  5. DWZ中关于iframeCallback和validateCallback的注意事项
  6. 组态王6.55WEB全新发布步骤
  7. 用root帐号切换其他帐号提示 su: warning: cannot change directory to /home/oracle: Permission denied
  8. poj1159 dp(滚动数组优化)
  9. 去除scons构建动态库的前缀lib
  10. react-native 学习 ----- React Navigation
  11. Python 学习之路
  12. docker、oci、runc以及kubernetes梳理
  13. 输入和输出--javase中的路径
  14. Python中什么是变量Python中定义字符串
  15. Java项目案例:酒店前台客服管理系统
  16. wpf小技巧——datagrid 滚动条问题
  17. Echo团队Alpha冲刺随笔 - 第四天
  18. ios真机调试错误解决:Installation of apps is prohibited by a policy on the device
  19. position 有五个值:static、relative、absolute、fixed、inherit。
  20. Ajax异步提交造成变量undefined

热门文章

  1. php安装扩展的地址
  2. I Hate It (HDU 1754)
  3. UVALive 3716 DNA Regions ——(扫描法)
  4. js-常见算法操作
  5. Java微信公众号开发梳理
  6. puppeteer爬虫服务
  7. 学号20175313 《实现Linux下Sort -t : -k 2功能》第十二周
  8. 学PHP应注意的问题与知识点
  9. mac下iterm配色、半透明与样式设置
  10. Android检测服务是否运行