Можно ли вводить свойства из Maven (пароли, определенные в settings.xml) в мой контейнер Spring?
Я определяю пароли на серверы через свойства, которые я определяю в своем ~/.m2/settings.xml(может быть где угодно, в том числе pom.xml) для моего плагина развертывания. Я бы хотел использовать те же свойства для своих интеграционных тестов. Есть ли способ сделать это?
Если нет, существует ли удобный способ обмена свойствами между Maven и TestNG?
Я хочу написать хороший тестовый пакет, который может работать на разных серверах непрерывной интеграции, указывая на разные удаленные хосты (разработка, тестирование, постановка и производство) без изменения кода.
Я определяю учетные данные для удаленной службы в settings.xml:
<properties>
<my.host>http://my.company.com</my.host>
<my.username>my-un</my.username>
<my.password>my-pw</my.password>
</properties>
Я хотел бы иметь возможность ссылаться на свойства в моих тестах unit/integration (src/test/resources), используя:
<?xml version="1.0" encoding="UTF-8"?>
<beans....
<bean class="java.lang.String" id="un">
<constructor-arg value="${my.username}"/>
</bean>
<bean class="java.lang.String" id="pw">
<constructor-arg value="${my.password}"/>
</bean>
</beans>
Есть ли какие-либо варианты для этого? Кто-нибудь еще пробовал это раньше? Я пишу много тестов REST, которые требуют авторизации в моих тестах.
Спасибо!
Ответы
Ответ 1
Конечно. Фильтр ресурсов Maven - это путь.
Здесь примерная конфигурация (файлы, соответствующие *-context.xml
, будут отфильтрованы, другие - нет):
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*-context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*-context.xml</exclude>
</excludes>
</resource>
</resources>
</build>
Другой подход - использовать Свойства Maven Plugin для write все свойства проекта в файл и ссылаются на этот файл из Spring, используя механизм PropertyPlaceholderConfigurer
.
Конфигурация Maven:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<phase>generate-test-resources</phase>
<goals>
<goal>write-project-properties</goal>
</goals>
<configuration>
<outputFile>${project.build.testOutputDirectory}/mavenproject.properties</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Spring Конфигурация:
<context:property-placeholder location="classpath:mavenproject.properties"/>
Ответ 2
Ну, @seanizer находится на правильном пути, но это можно упростить, поскольку вы уже можете установить свои свойства в maven. Установите их в своей папке и в конфигурации Spring, все, что вам нужно сделать, это получить доступ к ним, поэтому простое изменение конфигурации, как это, будет выполнено.
<beans....
<context:property-placeholder />
<bean class="java.lang.String" id="un">
<constructor-arg value="${my.username}"/>
</bean>
<bean class="java.lang.String" id="pw">
<constructor-arg value="${my.password}"/>
</bean>
</beans>
Местоположение не требуется, так как свойства, которые вас интересуют, теперь устанавливаются как системные свойства maven. PropertyPlaceholderConfigurer будет работать с теми, которые указаны в файле, который не требуется в этом конкретном случае. Обратите внимание, что вам нужно будет включить схему для контекста.
Я бы переместил их из вашего текущего местоположения, хотя, поскольку это глобальный параметр, ваш pom является специфичным для проекта, поэтому я думаю, что именно там он и находится.
Ответ 3
Вы можете заставить Maven подставить определенное значение в ваш XML файл, когда maven создает проект с определенным профилем. Так, например, вы бы установили тестовый файл в вашем maven pom, и когда вы будете строить с этим профилем, xml файл в вашей банке будет иметь желаемое свойство. Посмотрите этот для примера.