我继承了 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,因此将客户属性文件简单地放在类路径上似乎是合乎逻辑的。