4

我继承了 Web 应用程序的责任,而它管理属性文件的方式似乎是错误的。属性文件在 WAR 文件中提供并位于目录中:

<tomcat>/webapps/<my web app>/WEB-INF/classes

对于我们的 Web 应用程序的首次安装者来说,这很好。默认属性文件具有许多默认设置,并且以这种方式指定默认值似乎比将值硬编码到 Java 代码中更好。

此文件仅在 Tomcat 启动时读取,但可以随时由正在运行的 Web 应用程序更新。

每当客户需要升级软件时,他们必须执行以下步骤

  1. 停止 tomcat 以停止 Web 应用程序。
  2. 制作文件的副本: foo.properties
  3. 删除现有的 Web 应用程序目录
  4. 部署新的war文件(纯粹是为了解包)
  5. 停止Tomcat(再次!)
  6. 将旧的 foo.properties 复制到新的(在 WEB-INF/classes 中)
  7. 重启tomcat。

这似乎冗长且容易出错 - 我们经常让用户意外擦除他们的属性文件。属性文件肯定应该以某种方式外部化吗?我喜欢包含默认值的 WAR 文件的想法,但是如果在类路径中找到另一个名为 foo.properties 的文件,是否有办法覆盖这些值?我真的希望新的部署是:

  1. 停止 Web 应用程序
  2. 部署新的 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,因此将客户属性文件简单地放在类路径上似乎是合乎逻辑的。

4

1 回答 1

3

如果我是您的客户,我也不会喜欢您当前的升级机制。我喜欢将属性分配给默认值的想法,但如果客户愿意,他们可以覆盖它们。这是实现它的一种方法。有两个属性文件 default.properties 和 external.properties。default.properties 具有默认值,而另一个是空的,可供客户使用。客户根本不会触及 default.properties。您可以在 /webapps//WEB-INF/classes 中保留 default.properties 的位置。另一个属性文件可以在任何地方,您可以使用系统属性指定它。假设你决定把它放在

 /home/customer/external.properties

现在更改您的 java 代码,使其加载 default.properties,然后加载 external.properties。如果在两个文件中都定义了一个属性,则首选 external.properties 中的属性。在文件中

$TOMCAT_HOME/bin/setenv.sh

声明以下环境变量

export JAVA_OPTS="-Dexternal.props=/home/customer/external.properties"

如果您在 Windows 上,则在 setenv.bat 中声明环境变量。现在您应该可以通过以下方式访问 external.properties 文件了

Properties properties = new Properties();
try {
      properties.load(new FileInputStream(System.getProperty("external.props")));
 } catch (IOException e) {
  ...
}
于 2013-09-27T05:02:00.817 回答