Ссылка на файл для PropertiesConfiguration с помощью Spring - PullRequest
0 голосов
/ 10 февраля 2012

Мое приложение работает на Jboss 4.2.2 GA с Spring 2.5.6, Richfaces 3.1.6.SR1, JSF 1.1_02. То, что я хочу, это иметь файл porpertie вне моего уха, который будет содержать s.th. как

  • информация1 = "Joey"
  • информации2 = "Диди"
  • information3 = "Marky"
  • [...]

Изменения в этом файле должны иметь немедленное влияние. Я начал так:

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;

[...]

PropertiesConfiguration configure = null;
{
try {
        configure = new PropertiesConfiguration("myProperties.properties");
        configure.setReloadingStrategy(new FileChangedReloadingStrategy());
        configure.setAutoSave(true);

    } catch (ConfigurationException e) {
        e.printStackTrace();
    }
}

Кажется, это работает, только если myProperties.properties находится где-то в целевой директории внутри моего уха. Поэтому я изменил свой код:

File file = new File(myAppRoot + FSEP + "appserver" + FSEP + "server" + FSEP +   "default"
                                + FSEP + "conf" + FSEP + "myApp" + FSEP + "myProperties.properties");
configure = new PropertiesConfiguration(file);
configure.setReloadingStrategy(new FileChangedReloadingStrategy());
configure.setAutoSave(true);

Это отлично работает. Но я хочу избежать использования абсолютного пути. Я уже определил

<bean id="myPropertyConfigurer"    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
[...]
<property name="locations">
  <list>
    <value>classpath:myProperties.properties</value>
    <value>classpath:myApp/myProperties.properties</value>
  </list>
</property>

1 Ответ

0 голосов
/ 10 февраля 2012

Вы можете добавить некоторые опции -D к Java, который запускает вашу программу. Например:

java ... -DjdbcPropsLocation=%YOUR_PROPERTIES_LOCATION% -DcustomInternalPropsLocation=%SOME_OTHER_PROPS_FILE_LOCATION% ...

, а затем используйте эту опцию в контексте приложения следующим образом: (Обратите внимание, что свойства, хранящиеся в файле internal.properties, перегружаются из-за использования разных мест, где побеждает последняя перегрузка, поэтому порядок важен.)

    <bean id="propsLocations" class="java.util.ArrayList" >
    <constructor-arg>
        <list>
            <value>classpath:jdbc.properties</value>
            <value>${jdbcPropsLocation}\jdbc.properties</value>
            <!-- loading the default internal properties -->
            <value>classpath:internal.properties</value>
            <!-- loading the meta-data.properties -->
            <value>classpath:meta-data.properties</value>
            <!-- overloading the internal properties with custom values -->
            <value>${customInternalPropsLocation}\internal.properties</value>
        </list>
    </constructor-arg>
</bean>


<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" >
        <list>
            <!-- <value>classpath:${jdbcPropsLocation}/jdbc.properties</value> -->
            <value>classpath:jdbc.properties</value>
            <value>${jdbcPropsLocation}\jdbc.properties</value>
            <!-- loading the default internal properties -->
            <value>classpath:internal.properties</value>
            <!-- loading the meta-data.properties -->
            <value>classpath:meta-data.properties</value>
            <!-- overloading the internal properties with custom values -->
            <value>${customInternalPropsLocation}\internal.properties</value>
        </list>
    </property>
</bean>

Кроме того, вы можете установить системное свойство (-D) из своего кода перед загрузкой контекста приложения, который использует ваши свойства:

System.setProperty(CUSTOM_INTERNAL_PROPS_LOCATION_PROP_KEY, CUSTOM_INTERNAL_PROPS_LOCATION_PROP_VAL);
...