前言

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

在前面的文章profile之springboot,springboot为我们提供了一种解决方案,而maven也提供了一种更加灵活的解决方案,就是profile功能。

原理

先看一段pom文件中的profile定义

 <profiles>
<profile>
<!--不同环境Profile的唯一id-->
<id>dev</id>
<properties>
<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
</profiles>

​ 可以看到定义了多个profile,每个profile都有唯一的id,也包含properties属性。这里为每个profile都定义一个名为profiles.active的properties,每个环境的值不同。当我们打包项目时,激活不同的环境,profiles.active字段就会被赋予不同的值。

结合resource属性

这个profiles.active字段可以应用到许多地方,及其灵活。可以在配置文件里被引用(参考此博客);也可以结合pom文件里的resource和filter属性,作为文件名的一部分或者文件夹名的一部分,下面会详细讲解这个用法。

注意:maven的profile用法有许多种,但基本原理就是根据激活环境的不同,自定义字段被赋予不同的值。

应用演示

项目结构

这里定义了dev,prod,test三个文件夹,用来演示maven中profile的使用。注意,每个文件夹里还定义了application-{xxx}.properties件,这里相当于结合springboot的Profile的使用,是我比较推荐的方式,和本文maven的profile使用无关系,在 application.properties都有spring.profiles.active=xxx去加载对应的application-{xxx}.properties

pom 文件里的关键配置为

    <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources/</directory>
<!--打包时先排除掉三个文件夹-->
<excludes>
<exclude>dev/*</exclude>
<exclude>prod/*</exclude>
<exclude>test/*</exclude>
</excludes>
<includes>
<!--如果有其他定义通用文件,需要包含进来-->
<!--<include>messages/*</include>-->
</includes>
</resource>
<resource>
<!--这里是关键! 根据不同的环境,把对应文件夹里的配置文件打包-->
<directory>src/main/resources/${profiles.active}</directory>
</resource>
</resources>
</build> <profiles>
<profile>
<!--不同环境Profile的唯一id-->
<id>dev</id>
<properties>
<!--profiles.active是自定义的字段,自定义字段可以有多个-->
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<!--activation用来指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失-->
<activation>
<!--这个字段表示默认激活-->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
</profiles>

可以看到我们利用resource属性来配置打包时,根据激活的环境来选取要打包的文件夹。我们使用maven命令

mvn clean package

prod环境被默认激活,打包后的包结构为

可以看到prod文件夹下的配置文件被打包进去,通过激活不同的profile也就实现了动态切换配置文件。

激活方式

profile的激活方式有很多种

  1. 通过maven命令参数

即在使用maven打包时通过-P参数,-P后跟上profile的唯一id,如

mvn clean package -Ptest

打包时test的profile被激活,打包后的包结构为:

  1. 通过pom文件里的activation属性

     <profile>
    <id>prod</id>
    <properties>
    <profiles.active>prod</profiles.active>
    </properties>
    <!--activation用来指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失-->
    <activation>
    <!--配置默认激活-->
    <activeByDefault>true</activeByDefault> <!--通过jdk版本-->
    <!--当jdk环境版本为1.5时,此profile被激活-->
    <jdk>1.5</jdk>
    <!--当jdk环境版本1.5或以上时,此profile被激活-->
    <jdk>[1.5,)</jdk> <!--根据当前操作系统-->
    <os>
    <name>Windows XP</name>
    <family>Windows</family>
    <arch>x86</arch>
    <version>5.1.2600</version>
    </os> <!--通过系统环境变量,name-value自定义-->
    <property>
    <name>env</name>
    <value>test</value>
    </property> <!--通过文件的存在或缺失-->
    <file>
    <missing>target/generated-sources/axistools/wsdl2java/
    com/companyname/group</missing>
    <exists/>
    </file>
    </activation>
    </profile>

    这里我写了多种方式,可以通过activeByDefault、jdk版本、操作系统、系统环境变量(在win10我试了不成功,win7可以,不知道为啥)、文件的存在或缺失,实际项目可以根据需要选取一种即可。这种的优先级低于maven命令参数指定的方式。

  2. settings.xml中使用activeProfiles指定(了解即可)

即mave目录下的settings.xml也可以添加下面的代码来指定激活哪个profile。

<activeProfiles>
<activeProfile>profileTest1</activeProfile>
</activeProfiles>

值得注意的是:

  • setting.xml在当前系统用户的.m2文件夹有(如没有可手动拷贝过去也会生效),针对的当前用户的profile配置,在maven的安装目录下“conf/settings.xml”,针对的是全局的profile配置。

  • profile也可以定义在setting.xml文件中,但是这种方式个人感觉并不实用的,不推荐。

profile的使用详解的更多相关文章

  1. Maven的porfile与SpringBoot的profile结合使用详解

        使用maven的profile功能,我们可以实现多环境配置文件的动态切换,可参考我的上一篇博客.但随着SpringBoot项目越来越火,越来越多人喜欢用SpringBoot的profile功能 ...

  2. Linux /etc/profile文件详解

    Linux /etc/profile文件详解   转载地址:http://linux.chinaitlab.com/administer/820910.html linux /etc/profile文 ...

  3. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

  4. 详解前端模块化工具-webpack

    webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不在,这时,使日渐增多的js代码变得合 ...

  5. linux查看端口及端口详解

    今天现场查看了TCP端口的占用情况,如下图   红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说E ...

  6. Tomcat使用详解

    Tomcat简介 官网:http://tomcat.apache.org/ Tomcat GitHub 地址:https://github.com/apache/tomcat Tomcat是Apach ...

  7. 史上最全的maven的pom.xml文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  8. maven全局配置文件settings.xml详解

    概要 settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径. settings.xml文件是干什么的,为什么要配置它 ...

  9. WebConfig配置文件详解

    今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...

随机推荐

  1. Linux usb 2. 协议分析

    文章目录 0. 背景 1. USB 协议传输格式 1.1 Packet 1.1.1 Token Packet 1.1.2 Data Packet 1.1.3 Handshake Packet 1.1. ...

  2. 解决一次gitlab因异常关机导致启动失败

    解决一次gitlab因异常关机导致启动失败 目录 解决一次gitlab因异常关机导致启动失败 1. 服务器异常关机 2. gitlab服务 2.1 进入gitlab容器内部 2.2 检查gitlab各 ...

  3. 『学了就忘』Linux基础命令 — 38、Linux中光盘的挂载

    目录 步骤一:创建一个空目录 步骤二:找到光盘的设备文件名称 步骤三:挂载光盘 步骤四:访问关盘中的数据 步骤五:卸载挂载点 问题:挂载点为什么要使用空目录 提示:关于Linux系统中光盘的挂载,我们 ...

  4. 关于使用idea工具debug时,断点颜色由红色变成灰色

    在使用断点调试的时候,发现断点由原来的红色变成灰色的,后来发现是由于错误操作将Debug断点t调试禁用了 ,只需要点击禁用按钮取消就可以了 

  5. Netty源码分析之Reactor线程模型详解

    上一篇文章,分析了Netty服务端启动的初始化过程,今天我们来分析一下Netty中的Reactor线程模型 在分析源码之前,我们先分析,哪些地方用到了EventLoop? NioServerSocke ...

  6. [luogu5438]记忆

    令$f(x)=\frac{x}{\max_{k^{2}|x}k^{2}}$,最优解即将$f(l),f(l+1),...,f(r)$排序,那么每存在一种不同的数则答案减1,那么$x$出现当且仅当$f(x ...

  7. Vulnhub-Empire: LupinOne题解

    Vulnhub-Empire: LupinOne题解 本靶机为Vulnhub上Empire系列之LupinOne,地址:EMPIRE: LUPINONE 扫描与发现 利用arp-scan命令扫描靶机I ...

  8. 记一次使用 SelectMany 的经历

    最近在改造一个功能时为了减少循环的层数,于是想着将List列表映射为一个能直接使用颗粒大小的List列表,这样一层循环就可以解决问题.     public class ConflictWordIte ...

  9. VSCode + PicGo + Github + jsDelivr 搭建稳定快速高效图床

    VSCode + PicGo + Github + jsDelivr 搭建稳定快速高效图床 目录 前言 准备 配置 验证 前言 所谓图床,就是将图片储存到第三方静态资源库中,其返回给你一个 URL 进 ...

  10. C语言中内存对齐与结构体

    结构体 结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充. struct STU{ int age; char name[15]; }; struct STU a; //结构体实例 str ...