Maven 3 разных профиля - Spring propertyPlaceHolderConfig не может использовать значение из файла pom

У меня возникли проблемы с maven 3 и я загружаю правильный файл .properties.

Я хочу добиться следующего: с помощью mvn -Plocal я хочу загрузить файл settings-local.properties, и если он запускается с помощью prod, я хочу загрузить файл settings-prod.properties.

Это работает с использованием mvn -Denv=local, но когда я пытаюсь использовать -Plocal, переменная не загружается (settings-${env}.properties не существует).

Мой пом.xml:

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <env>local</env>
        </properties>
    </profile>
</profiles>

В моем контексте приложения я хочу загрузить переменную env:

<bean id="propertyPlaceholderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
                <list>
                        <value>classpath:settings-${env}.properties
                        </value>
                </list>
        </property>
        <property name="ignoreUnresolvablePlaceholders">
                <value>true</value>
        </property>
</bean>

Так в чем проблема, разве это не должно работать в обе стороны?


person Nitro    schedule 13.09.2011    source источник
comment
Итак, я наконец узнал, в чем проблема в моем примере. У меня была аннотация @ в контексте приложения, поэтому даже когда я использовал фильтрацию, она не работала, пока я не удалил аннотации или экранировал строку с помощью maven.apache.org/plugins/maven-resources-plugin/examples/   -  person Nitro    schedule 13.09.2011


Ответы (2)


Я думаю, вы путаете PropertyPlaceholderConfigurer с механизмом Maven Filtering. Это похожие, но совершенно разные механизмы (но их можно использовать вместе).

  • Spring PropertyPlaceholderConfigurer позволяет получать значения из файла свойств для использования в контексте вашего приложения Spring.

  • Фильтрация Maven позволяет заменять значения в текстовых файлах (включая файлы свойств) значениями из ваших свойств и среды Maven.

Вы можете комбинировать их, но тогда это становится двухэтапным процессом. Ваша сборка Maven использует фильтрацию для помещения значений в ваши файлы свойств, а затем, в свою очередь, это может быть прочитано Spring. Запутались? (я)

person Mark McLaren    schedule 13.09.2011
comment
Спасибо, что немного прояснили и заставили меня еще раз взглянуть на это. Да, это сбивало с толку, но проблема с моим способом заключалась в том, что @ в контексте приложения он не работал. По escapeString это сработало. maven.apache.org/plugins/maven-resources- плагин/примеры/ - person Nitro; 13.09.2011

Свойства проекта Maven не являются системными свойствами, поэтому это не будет работать из коробки.

Вы можете использовать фильтрацию ресурсов Maven для замените ключи свойств в файле контекста Spring. Или, что еще лучше, иметь файл свойств, который вы фильтруете и ссылаетесь на него из Spring.

person Sean Patrick Floyd    schedule 13.09.2011
comment
Что я хочу сделать, а также безуспешно пытался использовать фильтрацию для замены переменной ${env}, но похоже, что applicationcontext.xml не будет отфильтрован/заменен. Есть ли у вас какие-либо решения для этого? - person Nitro; 13.09.2011