以下是我使用或遇到的一些可能的做法。在实践中通常需要将这些结合起来。
构建时替换conffiles中的变量值
这是一个如何使用 Apache Ant 完成此操作的示例。 Ant 属性 (${var.name}) 可以通过构建配置文件进行控制:
<filterset id="variables.to.replace">
<filter token="APPNAME" value="${app.name}"/>
<filter token="WEBAPP-PATH" value="${webapp.path}"/>
<filter token="ENCRYPT-ALGORITHM" value="${encrypt.algorithm}"/>
<filter token="ERROR-MAILTO" value="${error.mailTo}"/>
<!--...-->
</filterset>
<!-- Then, when building & copying the conf, replace the variables: -->
<copy todir="${properties.target.dir}">
<!-- env specific conf files -->
<fileset dir="${basedir}/env/${run.env}/webapp/WEB-INF/classes" />
<filterset refid="variables.to.replace"/>
</copy>
好处是您可以在构建时很好地控制不同的配置。不好的是,如果您将这种方法广泛用于大量不同的配置,系统往往会变得非常复杂且难以维护。此外,必须构建配置文件也意味着开发周期变慢。
在 webapp 启动时替换 conf inside war 中的变量
这是我在使用 Spring Framework 时通常会做的事情,即使只有一种可能的配置,也可以获得关注点分离的好处。使用 Spring,您可以在 webapp 启动时在 Spring 上下文中将 conf 值替换为 PlaceholderPropertyConfigurer。在这种情况下,无论如何您都必须选择正确的配置,例如可以在构建时进行配置。
与构建时间替换相比,如果需要,在未压缩的 web 应用中临时操作值更容易。当然,如果您更改任何内容,则需要重新启动 webapp,并且手动更改不会在 webapp 重新部署中持续存在。 Spring 也仅限于 Spring 上下文,因此 this doesnt' work e.g. in web.xml(但由于其局限性,应该避免在 web.xml 中包含变量)。
从预定义文件中读取本地配置
这种方法可能是最容易设置的方法:只需创建一个配置文件路径,例如$HOME/mywebapp/conf.properties 并让您的网络应用在启动时以某种方式读取它。
这里的好处是您在构建/部署 webapp 时不必关心 conf。不管怎样,你应该有一些合理的 conf 默认值,然后可以被本地 conf 覆盖。
将 conf 保存在数据库中
这是覆盖 conf 参数的最灵活的解决方案,但在某些情况下也会变得复杂。将 conf 放在包含 name 和 value 列的表中应该适用于大多数情况。
当然,您不能在数据库表中配置 JDBC 连接 url,但对于在设置 db 连接后影响 webapp 操作的简单文本/数字配置,这是一个很好的解决方案。为避免性能损失,请确保以某种方式缓存 conf,如果它会被频繁访问。
额外练习
正如 kgiannakakis 所指出的,它还有助于为您的应用设置某种配置诊断页面。