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

时间:2010-11-05 15:12:01

标签: java spring maven-2 continuous-integration

我通过我在〜/ .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>

我希望能够使用以下方法在我的单元/集成测试(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测试,需要在我的测试中进行授权。

谢谢!

4 个答案:

答案 0 :(得分:31)

不确定。 Maven resource filtering是要走的路。

以下是一个示例配置(匹配*-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 Pluginwrite all project properties to a file并使用the PropertyPlaceholderConfigurer mechanism从Spring引用该文件。

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

答案 1 :(得分:5)

嗯,@ 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是项目特定的,所以我认为它就属于它。

答案 2 :(得分:1)

当maven使用特定的配置文件构建项目时,您可以让Maven将特定值替换为您的xml文件。因此,例如,您将在maven pom中设置测试prfile,当您使用该配置文件构建时,jar中的xml文件将具有所需的属性。请查看this以获取示例。

答案 3 :(得分:0)

您可以在属性文件中定义值,并使用pom.xml中的${my-pw-key}引用它们,并使用插件properties-maven-plugin创建属性文件

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>read-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <file>${basedir}/src/main/resources/env.properties</file>
                        </files>
                    </configuration>
                </execution>
            </executions>
        </plugin>

属性文件(env.properties

my-pw-key=abc&123 #your password here

然后运行maven mvn initialize package(初始化以从属性文件加载值)