maven profile

2021-12-30/2021-12-31

参考文档:
maven(三)最详细的profile的使用
maven profile动态选择配置文件

1. 前言

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

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

2. 原理

2.1 profile 定义

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

 1<profiles>
 2    <profile>
 3        <!--不同环境Profile的唯一id-->
 4        <id>dev</id>
 5        <properties>
 6            <!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
 7            <profiles.active>dev</profiles.active>
 8        </properties>
 9    </profile>
10    <profile>
11        <id>prod</id>
12        <properties>
13            <profiles.active>prod</profiles.active>
14        </properties>
15        <activation>
16            <activeByDefault>true</activeByDefault>
17        </activation>
18    </profile>
19</profiles>

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

2.2 项目目录

image-20211231100112483

2.3 关键配置

配置完 profiles 后,我们还需要在 pom 中配置 resources 和 filters

 1<build>
 2    <!-- 根据被激活的 profiles.active 来选择配置文件 -->
 3    <filters>
 4        <filter>src/main/resources/application-${profiles.active}.properties</filter>
 5    </filters>
 6    <resources>
 7        <resource>
 8            <directory>src/main/resources</directory>
 9            <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->
10            <filtering>true</filtering>
11            <!-- 打包时排除环境配置文件 -->
12            <excludes>
13                <exclude>**/application-*.properties</exclude>
14            </excludes>
15        </resource>
16    </resources>
17</build>

2.4 激活 profile

激活 profile 的方式有很多种

默认激活

1<activeByDefault>true</activeByDefault>

当没有指明要激活哪个 profile 时,默认激活这个。

maven 命令激活

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

1mvn package -Ptest

通过 pom 文件里的 activation 属性

 1<profile>
 2    <id>prod</id>
 3    <properties>
 4        <profiles.active>prod</profiles.active>
 5    </properties>
 6    <!--activation用来指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失-->
 7    <activation>
 8        <!--配置默认激活-->
 9        <activeByDefault>true</activeByDefault>
10        <!--通过jdk版本-->
11        <!--当jdk环境版本为1.5时,此profile被激活-->
12        <jdk>1.5</jdk>
13        <!--当jdk环境版本1.5或以上时,此profile被激活-->
14        <jdk>[1.5,)</jdk>
15        <!--根据当前操作系统-->
16        <os>
17            <name>Windows XP</name>
18            <family>Windows</family>
19            <arch>x86</arch>
20            <version>5.1.2600</version>
21        </os>
22        <!--通过系统环境变量,name-value自定义-->
23        <property>
24            <name>env</name>
25            <value>test</value>
26        </property>
27        <!--通过文件的存在或缺失-->
28        <file>
29            <missing>target/generated-sources/axistools/wsdl2java/
30                        com/companyname/group</missing>
31            <exists/>
32        </file>
33    </activation>
34</profile>

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

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

1<activeProfiles>  
2     <activeProfile>profileTest1</activeProfile>  
3</activeProfiles>

2.5 配置文件引用变量

比如在 profile 中声明 server.port

 1<profiles>
 2    <profile>
 3        <id>prod</id>
 4        <properties>
 5            <profiles.active>prod</profiles.active>
 6            <server.port>8080</server.port>
 7        </properties>
 8        <activation>
 9            <activeByDefault>true</activeByDefault>
10        </activation>
11    </profile>
12</profiles>

springBoot 项目可以使用声明的变量

1server:
2  port: @server.port@

其他项目可以通过 ${server.port} 引用

评论
发表评论
       
       
取消