如果这是重复的话我道歉,我找不到任何描述我想要的东西。我正在构建一个webapp,它具有许多不同的属性,除了需要更改的许多.properties
配置文件之外,还需要根据环境进行更改。现在我有一个全局枚举(DEVELOPMENT
,STAGING
和PRODUCTION
),用于确定在应用程序中使用哪些字符串常量,然后我使用了一堆注释在数据库服务器之间切换的配置文件等。必须有一个更好的方法来做到这一点...我理想的是希望能够在一个文件中进行一次更改(一个大的块评论会很好...... )调整这些配置。我看到this post答案是利用我真正喜欢的JNDI,但似乎我需要从启动的servlet或在启动时初始化的bean调用它以便使用它对于我的log4j或JDBC配置文件。
有没有人有解决这个问题的策略?
谢谢!
答案 0 :(得分:1)
我不确定这种策略是否适用于您的情况,但过去我已成功使用我们的构建工具(在这种情况下为ant)根据配置文件构建不同的war文件。因此,您的源代码树中将有多个log4j配置文件,然后根据用于构建它的配置文件从最终版本中删除您不想要的那些文件。
可跟踪性变得有点困难(即有时难以弄清楚哪一个用于构建它),但从代码的角度来看,这是一个非常干净的解决方案,因为它都是在构建脚本中完成的。
答案 1 :(得分:0)
我们将所有默认配置值存储在单个XML文件中。在部署期间,我们应用XML补丁(RFC-5261),其中包含特定于环境的值。
http://tools.ietf.org/html/rfc5261 http://xmlpatch.sourceforge.net/
答案 2 :(得分:0)
我将假设您的属性文件由95% name = value 对组成,这些对在所有部署环境中都是相同的,并且 name = value 从一个部署环境更改为另一个部署环境的对。
如果这个假设是正确的,那么你可以尝试类似下面的伪代码。
void generateRuntimeConfigFiles(int deploymentMode)
{
String[] searchAndReplacePairs;
if (deploymentMode == Constants.PRODUCTION) {
searchAndReplacePairs = ...
} else if (deploymentMode == Constants.STAGING) {
searchAndReplacePairs = ...
} else { // Constants.DEVELOPMENT
searchAndReplacePairs = ...
}
String[] filePairs = new String[] {
"log4j-template.properties", "log4j.properties",
"jdbc-template.properties", "jdbc.properties",
"foo-template.xml", "foo.xml",
...
};
for (int i = 0; i < filePairs.length; i += 2) {
String inFile = filePairs[i + 0];
String ouFile = filePairs[i + 1];
searchAndReplaceInFile(inFile, outFile,
searchAndReplacePairs);
}
}
您的应用程序在初始化可能依赖于属性/ XML文件的任何其他内容之前调用generateRuntimeConfigFiles()
。
现在唯一需要解决的问题是如何存储和检索searchAndReplacePairs
的不同设置。也许您可以从production.properties
,staging.properties
和development.properties
等名称的文件中获取它们。
如果上述方法对您有吸引力,请给我发电子邮件以获取searchAndReplaceInFile()
的源代码,以免您需要重新发明轮子。您可以从我的Stackoverflow个人资料中的“信息”框中找到我的电子邮件地址。
答案 3 :(得分:0)
我建议使用Apache Commons配置。它提供了根据您的环境处理不同配置的所有管道。