2009-08-11 57 views
1

我是使用我的應用程序儘可能「動態」的屬性的大用戶(使用PropertyPlaceholderConfigurer)。幾乎所有的常數都是這樣定義的。無論如何,我目前正在定義一個默認WAR附帶的default.propertiesWebSphere和PropertyPlaceholderConfigurer

在其它環境中(接受/生產)我需要覆蓋的配置。我這樣做如下:

<bean id="propertyManager" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:com/company/default.properties</value> 
       <value>file:${COMPANY_PROPERTIES_LOCATION}\kbo-select-settings.properties</value> 
      </list> 
     </property> 
    </bean> 

有了這意味着我可以用一個可升級的構建爲每個環境。

不過,我不喜歡做的事實,我不能我的任何性質的來自內部的WebSphere改變。相反,我必須去每個服務器(我們有8個羣集)並相應地更改屬性。這將是一個很多用戶更友好,如果我可以從WebSphere中改變這些,只是執行重新啓動之後...

任何人有我怎麼可能做這樣的可提升構建的想法?我已經爲datasources/java mail/etc定義了JNDI配置。

謝謝!

回答

2

我們通過對每個環境(當地,開發,INT,TST ......)屬性文件的擴展解決了這個問題,並且每個文件包含特定值的環境。您只需要添加一個用於設置-Druntime.env = X的服務器上的VM參數。

你在你的配置文件中查找,然後將這個樣子

<bean id="propertyManager" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:com/company/default.properties.${runtime.env}</value> 
      <value>file:${COMPANY_PROPERTIES_LOCATION}\kbo-select-settings.properties</value> 
     </list> 
    </property> 
</bean> 

當然,如果你有相當靜態的環境中,這只是工作,因爲它仍然本身不適合在運行時改變它,但它確實使得應用程序的升級變得簡單。如果你希望能夠改變值,而不重新部署應用程序,你必須讓他們存儲在您的應用程序,您似乎已經做了kbo-select-settings.properties

0

如果配置在EAR文件,然後我所知,沒有簡單的方法來傳播完成借殼沒有作弊或重新部署應用程序的變化。

我認爲,配置,特別是當你推動應用程序改變應該不是應用程序。

一種方法是Keys Botzum的描述here

注意,你可以不屬於任何特定的應用進行使用標準WebSphere同步節點的部分實際上傳播完成的文件。

另一種選擇是使用數據庫進行配置。現在,將XML插入到DB2等數據庫中並不是很困難。

0

添加外指向您的配置文件到您的Web服務器,然後在您的應用程序中查看的URL資源是一種可行的方法。然後,您可以將url配置爲指向所有配置文件的中心位置 - 如果使用svn並且svn具有隻讀訪問權限,則甚至可以直接從svn(通過http)讀取它們。

春天一些內置該設備,而且也意味着你可以優先考慮各種配置文件。

欲瞭解更多信息,看看how-to-differentiate-between-test-and-production-properties-in-an-application

0

,我已經處理了這個是使用在JVM的屬性值,但隨後他們參考是在cluser或單元級別定義一個WebSphere變量的方式。例如,假設你想要一個名爲值1值參數1設置在Spring配置,你會做到以下幾點:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> 

然後像如下可做參考的變量:

<bean id="id" class="com.blah.class"> 
     <property name="value1" value="${param1}" /> 
</bean> 

然後內你的測試,你可以設置你的測試如下:

/** 
    * @see org.springframework.test.AbstractSingleSpringContextTests#prepareApplicationContext(org.springframework.context.support.GenericApplicationContext) 
    */ 
    @Override 
    protected void prepareApplicationContext(GenericApplicationContext context) { 
     System.setProperty("param1", "myvalue"); 
     } 
從WebSphere配置中,

然後,如果你創建一個JVM變量,並將其鏈接到WebSphere變量,您只需更改WebSphere變量,它將自動更新每臺計算機上的所有JVM變量。

要做到這一點,創建一個JVM變量,名爲:

參數1

與值$ {} webspherevar.param1

然後創建一個名爲一個WebSphere變量:

webspherevar .param1

它包含任何你需要放入的值。這樣,您就不必爲每個環境提供值,而是可以將其裝載到環境中並使用。

我希望這會有所幫助。

1

一個潛在的問題是您正在對屬性文件的位置進行硬編碼。你可以指定文件作爲JNDI資源和回落上的類路徑中指定的默認值的屬性的位置:

<!-- try to lookup the configuration from a URL, if that doesn't work, fall back to the properties on the classpath --> 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <bean class="org.springframework.core.io.UrlResource"> 
      <constructor-arg> 
       <jee:jndi-lookup 
        jndi-name="url/config" 
        default-value="file:///tmp" /> <!-- dummy default value ensures that the URL lookup doesn't fall over if the JNDI resource isn't defined --> 
      </constructor-arg> 
     </bean> 
    </property> 
    <property name="properties"> 
     <bean class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
      <property name="locations"> 
       <list> 
        <value>classpath:com/company/default.properties</value> 
       </list> 
      </property> 
     </bean> 
    </property> 
    <property name="ignoreResourceNotFound" value="true"/> 
</bean> 

這樣,你可以指定使用資源的WAS控制檯不同的環境不同的文件名> URL >通過使用JNDI名稱「url/config」創建資源並將其指向正確的文件(file:/// your/path/to/properties)來創建URL。

作爲一種替代解決方案,如果您想通過控制檯管理單個屬性,您可以使用jee:jndi-lookup來取代web.xml env-entries中的值(您可以通過該控制檯管理控制檯,而不是使用PropertyPlaceholderConfigurer)使用WAS控制檯)。見this answer

相關問題