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

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

<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 resources:resources阶段将这些属性替换为我的servlet-context.xml文件。 对于settings.xml上部分的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服务器上进行类似的设置。 我们不想分享一个共同的用户名/密码/等。


    有一种通过配置Maven War Plugin过滤Web资源的方法。 从官方插件的文档中查看这个片段。

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


    我建议你在中间使用一个属性文件。 我的意思是:Spring应用程序将使用context:property-placeholder加载属性文件的属性值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>
    

    我还没有尝试过,但根据这个maven wiki页面,您应该能够使用settings.来引用settings.xml中的settings. 字首。 因此${settings.servers.server.username}应该在settings.xml返回username

    链接地址: http://www.djcxy.com/p/10795.html

    上一篇: Using Maven settings.xml properties inside Spring context

    下一篇: PerformanceCounter.NextValue() throws InvalidOperationException