2009-10-28 2 views
2

Мое приложение должно знать путь к каталогу, в котором он может хранить свои данные. Я попытался установить системное свойство Java и использовать эту переменную в качестве заполнителя в моем Spring XML.Свойства системы не могут быть разрешены в Spring XML с использованием Maven

В Eclipse я добавил это свойство в среду моей конфигурации запуска, и он работает нормально. Spring решает $ {dataDir} на правильный путь.

Но когда я тестирую приложение с использованием Maven2 (mvn test -DdataDir = c:/data), Spring жалуется, что он не может разрешить местозаполнитель.

My Spring XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 

xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<!-- Allows me to use system properties in this file --> 
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> 

<bean id="xmlConfiguration" class="org.apache.commons.configuration.XMLConfiguration"> 
    <constructor-arg index="0"> 
    <value>${dataDir}/conf/config.xml</value> 
    </constructor-arg> 
</bean> 
</beans> 

Почему это свойство системы не передается Spring? Что я делаю не так? Спасибо за любые предложения!

EDIT: Конечно, вы правы: $ {baseDir} должен быть $ {dataDir}. Но это был просто опечатка в этом вопросе, а не в реальном коде.

Я попытался MAVEN_OPTS раньше, но это не работает, либо ...

+1

должно быть baseDir, а не dataDir – toolkit

+0

toolkit, да, я так думаю. –

ответ

4

Это известная ошибка в плагине Surefire 2.4.3. Подробнее см. В выпуске JIRA «System properties set on the command line get clobbered». Используйте предыдущую версию, 2.4.2 вместо:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <!-- Use 2.4.2 because 2.4.3 has bug with system properties 
      see http://jira.codehaus.org/browse/SUREFIRE-121 --> 
     <version>2.4.2</version> 
    </plugin> 
    </plugins> 
</build> 
1

Возможно МВН тест не проходит через систему свойств, которые он запускается на тесты? Можно ли передать свойства с помощью тестового плагина (который сам может вытащить их из свойств системы)?

Смотрите также: http://maven.apache.org/maven-1.x/plugins/test/properties.html

+0

Это лучшее решение - встраивание любых необходимых свойств в ваш файл POM. Таким образом, они хранятся вместе с проектом, чтобы все члены команды имели к ним доступ (и не должны настраивать их отдельно), и поэтому они контролируются версиями. –

0

Если вы посмотрите на mvn сценарий, вы можете увидеть, что все аргументы, переданные через командную строку, передаются в качестве аргументов класса запуска, а не в качестве аргументов JVM. Так что -D не будет работать.

Самое быстрое обходное решение - определить переменную среды MAVEN_OPTS, например.

set MAVEN_OPTS="-DdataDir=c:/data" 

, а затем запустить mvn test

+0

Я думаю, что это уже не так. Последнее дополнение к проблеме JIRA, связанное с выбранным ответом, говорит: «Системные реквизиты, переданные непосредственно в JVM через MAVEN_OPTS, не перенаправляются на тесты». – Patrick

0

Может быть, вы должны использовать одинаковые имена переменных? Я имею в виду, что вы передаете dataDir, но ожидаете baseDir. Я ошибаюсь?

0

Я думаю, что flicken-х answer правильный ответ на ваш вопрос.

Однако я бы предложил переместить файл config.xml в src/test/resources. Кажется, это идеальное место (в мире maven), и таким образом, файл будет доступен по пути к классам (так что вам не придется использовать абсолютный путь). Кроме того, файл окажется в контроле версий, как и любой другой ресурс проекта, что хорошо.

Если вы хотите сохранить его вне структуры проекта, я бы использовал resources filtering для фильтрации вашего конфигурационного файла Spring и установки ${dataDir} во время сборки.

+0

Файл должен храниться вне проекта, потому что он не должен быть перезаписан, когда я хочу обновить приложение. Но держать его под контролем версий является хорошим моментом. Подумайте об этом – Olvagor