【发布时间】:2013-10-03 02:38:28
【问题描述】:
我继承了 Web 应用程序的责任,而它管理属性文件的方式似乎是错误的。属性文件在 WAR 文件中提供并位于目录中:
<tomcat>/webapps/<my web app>/WEB-INF/classes
对于我们的 Web 应用程序的首次安装者来说,这很好。默认属性文件有许多默认设置,以这种方式指定默认值似乎比将值硬编码到 Java 代码中更好。
此文件仅在 Tomcat 启动时读取,但可以随时由正在运行的 Web 应用程序更新。
当客户需要升级软件时,他们必须执行以下步骤
- 停止 tomcat 以停止 Web 应用程序。
- 复制文件:foo.properties
- 删除现有的 Web 应用程序目录
- 部署新的war文件(纯粹是为了解压)
- 停止 tomcat(再次!)
- 将旧的 foo.properties 复制到新的(在 WEB-INF/classes 中)
- 重启tomcat。
这似乎冗长且容易出错 - 我们经常让用户意外擦除他们的属性文件。属性文件肯定应该以某种方式外部化吗?我喜欢包含默认值的 WAR 文件的想法,但是如果在类路径中找到另一个名为 foo.properties 的文件,是否有办法覆盖这些值?我真的希望新的部署是:
- 停止 Web 应用程序
- 部署新的 Web 应用程序
它会从外部位置获取属性。
Tomcat 是否提供了执行此操作的任何技术,或者我是否应该简单地更改 Java 代码以在其他地方查找属性文件(例如用户的主目录)?
在写这个问题时,我遇到了对 conf/catalina.properties 的引用,以及如何使用它来指定将在 WEB-INF/classes 之前读取的目录。但是修改 common.loader 和 shared.loader 似乎完全没有效果!我从:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 获得此信息。
非常感谢任何建议。
更新 属性文件正在通过 Spring 加载。 bean 文件有以下内容:
<value>classpath:foo.properties</value>
现在我可以更改使用此属性文件的 bean 的实例化方式,并具有不同的属性文件加载机制。但是由于 Spring 只是查看类路径以获取 foo.properties,因此将客户属性文件简单地放在类路径上似乎是合乎逻辑的。
【问题讨论】:
标签: spring tomcat web-applications properties startup