maven学习笔记(四)profile的使用

本文介绍了如何使用Maven的Profile机制解决不同环境配置问题,通过设置Profile来管理开发、测试和生产环境的配置,如版本控制和环境变量。在实际项目中,通过父POM中的properties定义版本,子模块继承并引用,实现版本统一管理。同时,利用maven-resources-plugin插件在.properties文件中读取POM中的变量,实现环境区分。在测试和生产环境中,通过指定Profile,可以方便地创建SNAPSHOT或RELEASE版本的jar包。

目录

背景

配置

生产中的使用

.properties读取pom中变量


背景

在开发过程中,我们的项目会存在不同的运行环境,比如开发环境、测试环境、生产环境,而我们的项目在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。而maven的profile机制可以很好的解决上述问题。

配置

先来看一组profile配置

<profiles>
        <profile>
            <id>test</id>
            <properties>
                <revision>${snapshot_version}</revision>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <revision>${release_version}</revision>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>

上面子节点的具体含义

id:profile的唯一标识,可用于命令行激活,如,mvn pacakge -Pmyid,即打包时指定使用id为myid的profile

activation:激活器,定义了自动触发此profile的条件逻辑

properties:自定义的可以在整个POM中作为替换使用的字段,如果启用,通常用作过滤器。格式是<name>value</name>

只介绍这三个,再对activation的子节点介绍一下:

activeByDefault:设为true,此profile将默认被激活,除非另一个profile激活通过命令行-P的方式或被其激活器激活

生产中的使用

在生产环境中,经常会遇到微服务各个模块升级版本以及不同环境打snapshot/release jar包的问题,那么是如何解决以上两类问题的呢

  • 子模块升级版本保持版本统一

项目中的目录结构如上图所示

父pom

可以看到父pom是通过${}的方式,找到了profile文件中revision所需依赖的版本,所依赖的版本再找到<properties>标签中具体的指向。

consumer子pom中的继承

<parent>
        <artifactId>crm-user-service</artifactId>
        <groupId>com.ziroom.crm</groupId>
        <version>${revision}</version>
    </parent>

provider中子pom的继承

<parent>
        <artifactId>crm-user-service</artifactId>
        <groupId>com.ziroom.crm</groupId>
        <version>${revision}</version>
    </parent>

provider中对consumer实体的依赖

<dependency>
            <groupId>com.ziroom.crm</groupId>
            <artifactId>crm-user-service-consumer</artifactId>
            <version>${project.version}</version>
        </dependency>

可以看到遵循了这样一种方式

由此就可以实现,父pom中改动一处版本,子模块跟着升级

<properties>    
     <snapshot_version>1.7.2-SNAPSHOT</snapshot_version>
     <release_version>1.7.2</release_version>
 </properties>
  • 区分环境

maven支持 mvn compile -Ptest的方式进行指定profile环境的编译,但是到了生产环境是如何编译的呢,我们公司采用的是omega平台集成了maven命令

测试环境

 

生产环境

 

根据以上的配置就可以在不同环境做区分。

项目现在的配置是发布后自动打出jar包,所以只需要在测试环境指定

<snapshot_version>xxxxxx-SNAPSHOT</snapshot_version>

在生产环境指定

<release_version>xxxxx</release_version>

就可以分别生成snapshot/release版本的jar包,并根据后缀名分别上传到不同的仓库。

.properties读取pom中变量

想要在.properties完成下面的效果,

先要引入maven-resources-plugin插件 

<plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
                <configuration>
                    <!-- 在构建路径中 指定源文件编译的字符编码 -->
                    <encoding>UTF-8</encoding>
                </configuration>
   </plugin>
</plugins>

上述插件的作用是替换掉.properties中的占位符,详细功能请参考maven-maven-resources-plugin插件使用 - 意犹未尽 - 博客园

配合profiles文件使用时,则在确定具体环境后,会从pom文件中找到<properties>标签,再找到对应的<env.name>标签替换掉.properties中的${env.name}。

pom文件
<profiles>
        <profile>
            <id>env.dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <env.name>dev</env.name>
                <log.console>&lt;appender-ref ref="CONSOLE"/&gt;</log.console>
            </properties>
        </profile>
        <profile>
            <id>env.test</id>
            <properties>
                <env.name>test</env.name>
            </properties>
        </profile>
    </profiles>

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值