在Spring上下文中使用Maven settings.xml属性

时间:2012-05-24 03:28:51

标签: spring maven

我的settings.xml目录中有一个Maven ~/.m2文件;它看起来像这样:

<settings>
    <profiles>
        <profile>
            <id>mike</id>
            <properties>
                <db.driver>org.postgresql.Driver</db.driver>
                <db.type>postgresql</db.type>
                <db.host>localhost</db.host>
                <db.port>5432</db.port>
                <db.url>jdbc:${db.type}://${db.host}:${db.port}/dbname</db.url>
            </properties>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>mike</activeProfile>
    </activeProfiles>
    <servers>
        <server>
            <id>server_id</id>
            <username>mike</username>
            <password>{some_encrypted_password}</password>
        </server>
    </servers>
</settings>

我想两次使用这些属性

  • 进入Maven的integration-test阶段后,设置并拆除我的数据库。使用Maven过滤,这非常有效。
  • 第二次运行我的Spring应用程序时,这意味着我需要在Maven的servlet-context.xml阶段将这些属性替换为我的resources:resources文件。对于settings.xml上部的属性,例如${db.url},这可以正常工作。 我无法弄清楚如何将我的数据库用户名和(解密的)密码替换为Spring servlet-context.xml文件。

我的servlet-context.xml文件的相关部分如下:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName"><value>${db.driver}</value></property>
    <property name="url"><value>${db.url}</value></property>
    <property name="username"><value>${username}</value></property>
    <property name="password"><value>${password}</value></property>
</bean>

这里的最终目标是让每个开发人员拥有自己的Maven设置(以及他们自己的机器上的数据库进行集成测试)......以及Jenkins服务器上的类似设置。我们不想共享通用的用户名/密码/等。

3 个答案:

答案 0 :(得分:2)

有一种通过配置Maven War Plugin来过滤Web资源的方法。请查看this以获取官方插件文档中的代码段。

顺便说一句,我强烈建议重新考虑这种基于过滤的方式,以便在构建时提供事实上的运行时配置。请注意,您必须重建相同的代码才能为其他环境准备包(或者编辑包内容)。您可以使用应用程序服务器的特定内容(至少JBoss有一个)或使用Spring,也可以像这样配置AFAIR。

答案 1 :(得分:1)

我建议您在中间使用属性文件。我的意思是:Spring应用程序将使用context:property-placeholder从属性文件加载属性值,Maven将使用过滤使用settings.xml中的值替换$ {...}变量。

您的属性文件:

db.driver=${db.driver}
db.url=${db.url}
username=${username}
password=${password}

您的servlet-context.xml文件

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

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName"><value>${db.driver}</value></property>
    <property name="url"><value>${db.url}</value></property>
    <property name="username"><value>${username}</value></property>
    <property name="password"><value>${password}</value></property>
</bean>

在你的pom.xml中

<resources>
    ...
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
    ...
</resources>

答案 2 :(得分:0)

我没有尝试过,但根据此maven wiki page,您应该能够使用settings.xml前缀引用settings.中的属性。因此${settings.servers.server.username}理想情况下应返回username中的settings.xml