1. 场景

最近开发一个web项目,用的maven构建,建立多个profile,对应不同环境,分别包含不同的配置,在打包的时候发现,xml和properties配置文件没有被替换为profile下定义的property属性值。

2. 解决方案:

WEB工程需要war插件,启用web资源目录的filter功能,而普通jar不需要。步骤如下:

1、定义profile和各个property属性值 2、定义maven-war插件,并确认webresource文件目录 3、开启filter功能 4、执行clean package -P(profile-id) 命令,可以正常替换web资源目录下的形如${}的变量

3. 示例

3.1. 定义profile

定义dev和uat两个profile,分别对应开发环境和uat环境:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <!-- 数据库相关配置-->
            <mysql.jdbc.url>192.168.1.224:3306/cd_pro</mysql.jdbc.url>
            <mysql.jdbc.username>root</mysql.jdbc.username>
            <mysql.jdbc.password>xxxxxx</mysql.jdbc.password>
            <!-- 环境配置 -->
            <application.context.ip>http://192.168.1.224/</application.context.ip>
            <site.id>510100</site.id>
            <!-- 支付相关配置-->
            <revisa.pay.service.id>123456</revisa.pay.service.id>
            <!--LOG4J日志级别-->
            <log4j.log.level>debug</log4j.log.level>
            <log4j.logfile.path>D:/logs/cd_pro.log</log4j.logfile.path>
            <memorycache.url>192.168.1.224:11211</memorycache.url>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>uat</id>
        <properties>
            <!-- 数据库相关配置-->
            <mysql.jdbc.url>10.150.39.21:3306/cd_pro</mysql.jdbc.url>
            <mysql.jdbc.username>root</mysql.jdbc.username>
            <mysql.jdbc.password>xxxxxx</mysql.jdbc.password>
            <!-- 环境配置 -->
            <application.context.ip>http://uat.zaichengdu.com/</application.context.ip>
            <revisa.pay.site.id>510100</revisa.pay.site.id>
            <!-- 支付相关配置-->
            <revisa.pay.service.id>123456</revisa.pay.service.id>
            <!--LOG4J日志级别-->
            <log4j.log.level>info</log4j.log.level>
            <log4j.logfile.path>/data/logs/cd_pro.log</log4j.logfile.path>
            <memorycache.url>10.150.38.106:11211</memorycache.url>
        </properties>
    </profile>
</profiles>

3.2. war插件配置和web资源目录定义

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <webResources>
            <resource>
                <!-- this is relative to the pom.xml directory -->
                <directory>src/main/resources</directory>
                <targetPath>WEB-INF/classes/</targetPath>
                <filtering>true</filtering>
            </resource>
        </webResources>
    </configuration>
</plugin>

关键是里边filtering配置,设置为true则开启资源过滤,能够将,${} 的配置替换为profile里边对应的property属性值。

3.3. 修改properties配置文件

我的mysql文件配置:

mysql.jdbc.url=${mysql.jdbc.url}
mysql.jdbc.username=${mysql.jdbc.username}
mysql.jdbc.password=${mysql.jdbc.password}

3.4. 执行命令

mvn clean package -Puat -maven.test.skip=true

执行如上命令,然后配置文件会被替换为profile中定义的值:

mysql.jdbc.url=10.150.39.21:3306/cd_pro
mysql.jdbc.username=root
mysql.jdbc.password=xxxxxx

4. 总结

WEB工程一定要配置war插件,制定web资源目录,并开启过滤功能,文件夹下的文本文件(xml、property)就能够替换profile定义的值。


相关阅读