2011-03-31 119 views
0

如果这是重复的,我无法找到任何描述我想要的内容的道歉。我正在构建一个Web应用程序,它具有许多不同的属性,这些属性需要根据环境进行更改,除此之外还需要更改一些.properties配置文件。现在我有一个全球性的枚举(DEVELOPMENTSTAGING,并PRODUCTION),用于确定哪些字符串常量在应用程序中使用,然后我利用一帮在配置文件中评论到数据库服务器之间切换等方面具有有一个更好的方法来做到这一点...我理想的情况是能够在一个文件中进行一次更改(大块注释将会很好...)来调整这些配置。我看到this post答案是利用我真正喜欢的JNDI,但似乎我需要从一个启动的servlet或一个开始初始化的bean调用它,以便将它用于我的log4j或JDBC配置文件。为多个部署整合Java webapp配置文件的策略

有没有人有处理这个问题的策略?

谢谢!

回答

1

我不知道如果这一战略将适用于您的情况,但在过去,我已经成功地使用了我们的构建工具(蚂蚁在这种情况下),以建立视状况不同war文件。因此,您的源代码树中会包含多个log4j配置文件,然后根据用于构建最终版本的配置文件删除不想从最终版本生成的配置文件。

可追溯性变得有些硬(即有时很难找出哪一个用于构建它),但是这是一个非常干净的解决方案,从代码的角度来看,因为这一切都在你的构建脚本来完成。

+0

我肯定会想到这一点,我认为这是一个很好的解决方案。我唯一的问题是,现在我没有使用构建工具,只是Eclipse(坏,我知道)。 – 2011-03-31 23:21:43

0

我们将所有的默认配置值存储在一个XML文件中。在部署期间,我们应用具有特定于环境的值的XML修补程序(RFC-5261)。

http://tools.ietf.org/html/rfc5261 http://xmlpatch.sourceforge.net/

0

我会假设你的属性文件的高达95%名称=值双是在所有部署环境相同的制造和名称=值中的5%会从一个部署环境更改为另一个部署环境。

如果这个假设是正确的,那么你可以尝试像下面的伪代码。

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); 
    } 
} 

你的应用程序调用generateRuntimeConfigFiles()之前初始化其他任何可能依靠性能/ XML文件。

现在你要处理的唯一问题是如何存储和检索searchAndReplacePairs不同的设置。也许你可以从名称如production.properties,staging.propertiesdevelopment.properties的文件中获得它们。

如果上面的方法吸引你,然后给我发电子邮件的searchAndReplaceInFile()的源代码,以节省您不必重新发明轮子。您可以在我的Stackoverflow配置文件的“信息”框中找到我的电子邮件地址。