2011-03-31 118 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配置文件的「信息」框中找到我的電子郵件地址。