2009-08-11 28 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

相关问题