使用Maven多环境打包

在开发Web项目的过程我们经常在各种环境中切换,比如开发环境,测试环境,线上环境。
如果完全手动去修改配置文件效率太低,而且还很容易出错,好在Maven比较强大,完全可以实现分环境打包的需求。

定义环境

这个很简单,只要在POM文件中列出来即可,示例代码如下:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <active.profile>dev</active.profile>
        </properties>
        <!-- 把当前profile设置为默认profile,可以同时这是多个为默认-->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <active.profile>test</active.profile>
        </properties>
    </profile>
    <profile>
        <id>product</id>
        <properties>
            <active.profile>product</active.profile>
        </properties>
    </profile>
</profiles>

上面列出了dev、test、product三种环境,如果你是使用InteliJ IDEA来开发的,你可在Maven的工具栏上看到这三种Profile。

配置打包规则

为了根据各种环境进行打包,我们要创建各个环境下的配置文件,根据当前触发的Profile来读取相应的配置。

上面filter文件夹中包含各种环境下的配置文件,我们可以根据当前的Profile来构造出对应的文件名,在Maven中的配置如下:

<build>
    <finalName>tableTools</finalName>
    <filters>
        <filter>src/main/filter/filter-${active.profile}.properties</filter>
    </filters>
    <resources>
        <!--包含所有配置文件-->
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*</include>
            </includes>
        </resource>
        <!--对指定文件过滤,避免影响其它配置文件-->
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>prop/</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

上面的配置就是Maven打包的配置,只不过添加了一些额外的参数。

finalName:最终打包之后的文件名

filters:配置需要过滤的文件,filter中的路径会随着active.profile的变化而改变

resources:该配置比较重要,因为我们的properties中一些配置的属性使用占位符表示的,它们的格式和Spring配置文件中的占位符很相似,会对Spring中的配置也进行替换,这是我们不想得到的结果。

编写配置文件

下面我们已配置mybatis的数据源为例来编写配置文件,看Maven是如何根据Profile来动态打包的。

  1. 在Spring配置MyBatis的数据源
<!-- 配置Presto数据源  -->
<bean id="prestoDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${presto.driverClass}"/>
    <property name="url" value="${presto.jdbcUrl}"/>
    <property name="username" value="${presto.jdbcUsername}"/>
    <!-- 初始化连接大小 -->
    <property name="initialSize" value="${initialSize}"></property>
    <!-- 连接池最大数量 -->
    <property name="maxActive" value="${maxActive}"></property>
    <!-- 连接池最大空闲 -->
    <property name="maxIdle" value="${maxIdle}"></property>
    <!-- 连接池最小空闲 -->
    <property name="minIdle" value="${minIdle}"></property>
    <!-- 获取连接最大等待时间 -->
    <property name="maxWait" value="${maxWait}"></property>
</bean>

这是一种常见的写法,我们没有将配置写死到XML文件中,而是将配置提取到properties文件中,这种方式只是起到一种解耦的目的,并不能满足动态打包的需求。

  1. 编写properties文件
local.environment=${local.environment}
local.driverClasss=com.mysql.jdbc.Driver
local.jdbcUrl=${local.jdbcUrl}
local.jdbcUsername=${local.jdbcUsername}
local.jdbcPassword=${local.jdbcPassword}

这里的配置文件也没有写死,也是用了占位符,如果我们能将这里的配置动态变化,那么就可以实现动态打包的功能了。
还记得上面Maven中第二个resource中的配置项吗,它们的目的就是为了在Maven打包的过程中对指定的文件进行替换,像Spring的XML配置文件我们并不希望它们被替换。
这里我们只要可以动态替换properties中的占位符即可,Spring配置文件的占位符会在程序运行时进行替换,而properties中的占位符在打包的过程中就已经进行了替换,这就是两种文件中占位符的作用,它们发生变化的时期不同。

发表评论

电子邮件地址不会被公开。 必填项已用*标注