2011-05-11 114 views
10

我有幾次遇到同樣的問題,我想對其他人對此問題的看法有所瞭解: 假設我們將Spring應用程序打包爲.war文件,我們想運行它在幾個環境。 (開發/測試/ preprod/prod /等)在Spring Web應用程序中處理配置文件

爲了訪問應用程序所需的基礎架構(數據庫/ web服務等),我們將訪問信息存儲在配置文件中,同時一些業務配置也在這些文件中。 假設我們使用.properties文件(因爲我們在戰爭中有一個彈簧應用程序,並且我們喜歡通過appcontext中的一行代碼讀取屬性) 並且還假設在不同的環境中我們不會沒有相同的appserver/servlet容器。 (例如:開發,測試:碼頭,preprod:tomcat的,PROD:GlassFish的)

我通常做的是創建多個Maven的型材,每個環境,每個相應的文件所需的配置。

現在最近我遇到了一個運行操作的人的問題: '如果在preprod環境中更改了數據庫,那麼我們真的必須在buildserver上生成具有適當配置文件的新版本? 我回答'不,你可以真正去....../webapps/currentApp/WEB-INF/classes/config/application.properties並在那裏更改值,然後重新啓動容器'

我們想出了一個解決這個問題的一些方面的解決方案: 使用Maven彙編插件我們在裏面嵌入了一個Jetty 這個戰爭使得它可以用作'可執行的'戰爭,同時也使我們有可能擁有一個全局配置XML, 嵌入式Jetty的入門者在分解的war目錄中創建/修改適當的.properties文件,然後才啓動應用程序。

但是,如果您想使用除Jetty以外的其他任何內容,這也不能解決問題。

大家怎麼處理同樣的情況?

回答

9

環境變量,外部配置文件

我們有類似的東西,一個Web應用程序在Tomcat中/ Weblogic的運行與春天。 我們所做的是定義一個environment property CONFIG_PATH,並將所有XML(包括spring config)和屬性文件放在該目錄中。

我們有多個屬性文件(每個環境),我們將其作爲tar文件發送。 Web應用程序從CONFIG_PATH目錄加載所有Properties/Spring配置文件。此變量在相應環境中定義爲環境變量

這樣我們就不會觸及WAR文件,也不會爲環境構建單獨的WAR。想想這個場景的:內置QA & PROD WAR文件,QA測試,QA戰爭的文件,部署在PROD但一些PROD WAR炸燬:(

我們做如下事情:

在Spring配置XML,我們定義:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="order" value="0"></property> 
    <property name="locations"> 
     <list> 
      <value>file:${CONFIG_PATH}/App.properties</value> 
     </list> 
    </property> 
</bean> 

參見所有變量和往常一樣在Spring配置

在web.xml中,我們定義如下Spring配置:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>file:${CONFIG_PATH}/**/spring-config.xml 
    </param-value> 
</context-param> 

QA/PROD團隊使用相應的環境文件部署相同的工件。如果事情爆發,我們只知道它的環境。屬性搞砸了。 HTH

+0

感謝你的回答,有趣的方法,看起來像值得一試。 – abalogh 2011-05-12 10:13:33

4

數據庫

開發商不能碰WAR一旦它去,我的工作環境,所以如果我們需要改變配置值,而無需重新部署我們把它放在一個關係數據庫。

那些不需要重新包裝,重新部署或退回服務器。但是,應用程序不得不定期刷新只讀配置。

JNDI

JNDI設置保持從環境到環境固定;這些更改由應用服務器管理員設置一次,不會更改。 (請參閱Oracle Tutorial

我正在討論應用程序自身配置的名稱/值對,而不是JNDI。

+0

保持配置在數據庫中是一個好主意,感謝您的輸入。但是後來我失去了自動讀取.properties文件,我必須在加載spring上下文後手動加載它們。 (或者拿出一個類似PropertyPlaceholderConfigurer的自己的實現,它使用數據庫) – abalogh 2011-05-11 16:47:52

2

對於數據源;在tomcat上下文中創建一個JNDI資源條目並將你的資源條目/配置從應用程序中分離出來是一種常見的方法。如果DB已更改,則可以重新配置容器中的JNDI資源(Tomcat,Jetty等)並重新啓動。如果你有一個容器場,那麼重啓你的tomcat實例將不會有問題。您可以在負載平衡器上停用它們,然後重新啓動。我認爲在Jetty中還有一個上下文文件,您可以在其中添加JNDI資源。此外,還有一些取決於不同背景的屬性的配置文件。您可以使用maven的「-P」參數選擇您的配置文件,並且您的項目將使用這些配置進行構建,例如針對不同的目標環境,例如實況和測試。

相關問題