[Maven学习笔记十]Maven Profile与资源文件过滤器

编程技术  /  houtizong 发布于 3年前   147

什么是Maven Profile

Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息

 

Profile的激活机制

1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个Profile作为当前Active的Profile,在编译处理资源文件时,即使用这个Profile

2.条件自动激活

    2.1 根据操作系统自动激活,如下配置后那么当在Windows家族的操纵系统上编译时,自动以这个profile作为当前Active的profile

   

        <profile>            <id>Dev</id>            <!--自动激活-->            <activation>                <os>                    <family>Windows</family>                </os>            </activation>       </profile>

   2.2 根据jdk激活

   2.3 根据文件是否存在激活

   2.4 根据System Properties属性和属性值激活

            <activation>                <property>                    <name>file.encoding</name>                    <value>UTF-8</value>                </property>            </activation>

   这表示当System.getProperty("file.encoding")为UTF-8,则激活这个Profile

    2.5 条件组合激活

  

            <!--自动激活-->            <activation>                <os>                    <family>Windows</family>                </os>                <property>                    <name>file.encoding</name>                    <value>UTF-8</value>                </property>            </activation>

 

基于Profile的资源文件过滤

当使用Profile进行编译环境定制时,主要的目的是将项目的配置依据编译的目标和目的进行自动的设值。例如,我们在开发环境下编译时,希望用到的数据库是测试数据库;当我们要编译打包到生产环境时,需要把项目中对于DB的配置信息设置为生产环境下的DB配置。

Profile和编译过程中的资源属性值替换,可以完成这个目的。

 

1. 定义两个Profile

个用于配置开发环境的DB信息,另外一个用于配置生产环境的DB信息。通常Profile的定义放在pom.xml文件的最后

 

 

 <profiles>        <profile>            <id>Dev</id>            <properties>                <db.username>test</db.username>                <db.passwd>test</db.passwd>                <db.url>jdbc:mysql://test:6080/user</db.url>            </properties>        </profile>        <profile>            <id>Prod</id>            <properties>                <db.username>prod</db.username>                <db.passwd>prod</db.passwd>                <db.url>jdbc:mysql://prod.com:6080/user</db.url>            </properties>        </profile>    </profiles>

 可见两个Profile的Properties中定义的属性完全一样,只是属性值会根据Profile在编译过程中动态进行设置

2. 创建jdbc.properties

在src/main/resources目录下创建jdbc.properties文件,内容如下

db.username=${db.username}db.passwd=${db.passwd}db.url=${db.url}

 

3. 配置资源文件的编译时动态根据选定的Profile替换

 

在pom.xml的build元素中,配置resources元素(实际上,即使不配置这个目录,Maven编译时,也会自动的对/src/resources目录的配置文件进行自动的使用Maven pom.xml定义的属性进行替换)

  <build>         <resources>            <resource>                <directory>src/main/resources</directory>                <filtering>false</filtering>            </resource>            <resource>                <directory>src/main/resources</directory>                <filtering>true</filtering>                <includes>                    <include>**/*.properties</include>                </includes>            </resource>        </resources>    </build>

 

4.编译

因为Profile没有指定自动激活,所以在编译时首先选择一个Profile,这里选择Prod,编译得到的jdbc.properties内容是

db.username=proddb.passwd=proddb.url=jdbc:mysql://prod.com:6080/user

 
资源文件属性值的替换是在编译源代码之前完成,

 

 5. 更新一步

上面是通过pom.xml文件中的属性对properties文件中的占位属性进行替换,这样当配置属性非常多时,这些属性将占据pom.xml文件大幅空间。Maven可以指定过滤文件的方式对具有占位属性的文件进行替换。

 

在具有占位属性的文件所在的Maven项目下pom.xml添加如下内容:

 

 <build>        <filters>            <filter>${project.basedir}/../src/main/filters/filter-${deploy.env.name}.properties</filter>        </filters>        <resources>            <resource>                <directory>src/main/resources</directory>                <includes>                    <include>**/*.*</include>                </includes>                <filtering>false</filtering>            </resource>            <resource>                <directory>src/main/resources</directory>                <includes>                    <include>**/*.properties</include>                </includes>                <filtering>true</filtering>            </resource>        </resources>    </build>

 

上面的deploy.en.name是在父pom.xml定义的。

 

    <profiles>        <profile>            <id>Dev</id>            <properties>                <deploy.env.name>dev</deploy.env.name>            </properties>        </profile>        <profile>            <id>Test</id>            <properties>                <deploy.env.name>test</deploy.env.name>            </properties>        </profile>        <profile>            <id>Prod</id>            <properties>                <deploy.env.name>production</deploy.env.name>            </properties>        </profile>    </profiles>

 

而filter-dev.properties,filter-test.properties,filter-production.properties则定义在跟父pom.xml平级的src目录(如下的路径表示)

 

${project.basedir}/../src/

 

 

 

 

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客