我可以将 Maven 中的属性(在设置中定义的密码.xml)注入到我的 Spring 容器中吗?

我通过在 ~/.m2/settings 中定义的属性来定义服务器的密码.xml(可以是任何地方,包括 pom.xml)来为我的部署插件定义密码。我想在集成测试中使用相同的属性。有没有办法做到这一点?

如果没有,有没有一种方便的方法在Maven和TestNG之间共享属性?

我想编写一个不错的测试套件,它可以在不同的持续集成服务器上运行,指向不同的远程主机(开发,测试,暂存和生产),而无需修改代码。

我正在设置中定义远程服务的凭据.xml:

<properties>
<my.host>http://my.company.com</my.host>
<my.username>my-un</my.username>
<my.password>my-pw</my.password>
</properties>

我希望能够使用以下命令在我的单元/集成测试(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>

另一种方法是使用 Properties Maven 插件将所有项目属性写入文件,并使用 PropertyPlaceholderConfigurer 机制从 Spring 引用该文件。

Maven Configuration:

<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>

弹簧配置:

<context:property-placeholder location="classpath:mavenproject.properties"/>

答案 2

好吧,@seanizer是正确的,但这可以简化,因为您已经可以在maven中设置属性。将它们设置在你的pom和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是特定于项目的,所以我认为这就是它所属的地方。


推荐