Maven profile实现不同环境的配置管理实践
作者:丑过三八线 发布时间:2021-11-11 09:52:15
前言
目前,企业项目的开发过程中,往往会使用配置文件来做一些配置项来实现项目部署的灵活性,避免硬编码的方式在环境变化时需要对代码进行重新编译。但是往往在项目周期中存在着各种环境:如开发环境、测试环境以及生产环境等,而且在不同的运行环境中可能牵扯到大量的配置项变化。如果在不同的部署环境中切换,对配置文件的管理往往容易让程序员感觉非常的混乱。
为了避免这种换乱,研发过程中也有比较多的手段进行。比如,有公司就采用VPN的虚拟网络环境,让测试环境、生产环境的网络一致,让程序员在不同环境中对版本进行发布时只需要对VPN进行切换即可。以免发生网络配置项改错,漏改等现象的发生。这样个人觉得还不错,唯一有一点句是调整网络环境、设备环境的成本应该也比较高。
当然profile的方式应该算是比较经济的。我知道的比如spring-boot、maven都可以支持到profile的方式来对不同环境进行指定。本文希望介绍一下,我理解的使用maven的profile方式来进行不同环境切换。讲得不到位的地方希望看官嘴下留情,也多指定。
Maven 的 profile:
在maven的 pom.xml
文件中有一个配置项叫着profiles
节点,如下:
<profiles>
<profile>
<id>test</id>
<properties>
<active.profile>test</active.profile>
<jdbc.url>127.0.0.1</jdbc.url>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>develop</id>
<properties>
<active.profile>develop</active.profile>
<jdbc.url>192.168.1.102</jdbc.url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>product</id>
<properties>
<actived.profile>product</actived.profile>
<jdbc.url>10.21.41.100</jdbc.url>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
其中profiles
节点下可以填写多个profile
其中profile
主要包含了三个属性id
、properties
、activation
。
id
应该是为了区分profile
用的。properties
就是对应的属性。activation
应该是主要用来指定是否被默认激活的,它还有一个子节点activeByDefault
, 如果子节点activeByDefault
内的值为true表示他会被激活。它还有一些子节点,但是不知道什么用。后续看看在学习下。
实践前期准备
我准备建立一个简单的maven功能来实践一下maven的profile
实现不同的配置管理,所以首先需要建议一个maven工程。本文采用的是idea进行试验的。一下是我建立工程的结构图。
由于我只是需要对配置文件进行管理,所以是完全不需要建立任何java类就可以的。
首先建立了三个
profile
相关的配置文件develop.properties
、product.properties
、test.properties
在三个文件中我就只写了一个属性
app.name
,三个文件中分别为develop.maven.profile
、product.maven.profile
、test.maven.profile
.为了验证在各类配置文件中都是可行的, 我建立了两个供测试的配置文件
application.properties
、application.xml
.
application.properties 的内容为:
application.xml的内容为:
实践一:
实践一主要采用profile
+ filter
的方式实现内容的注入。
该方式的思想是通过 filter下的文件编写可变动的配置项,由filters
标签引入不同的配置文件项,然后提取不同的配置文件中的配置项填充到resources
下的配置文件中。
所以其中的关键标签包含了 profile
filter
resource
Maven的配置文件pom.xml
的内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>maven-test</artifactId>
<groupId>com.maomao.maven</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-profile</artifactId>
<version>1.0-SNAPSHOT</version>
<profiles>
<profile>
<id>test</id>
<properties>
<active.profile>test</active.profile>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>develop</id>
<properties>
<active.profile>develop</active.profile>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>product</id>
<properties>
<actived.profile>product</actived.profile>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<filters>
<filter>src/filters/${active.profile}.properties</filter>
</filters>
<resources>
<resource>
<!--一定要让filtering为true 否则无法对内容进行注入-->
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
执行maven命令进行打包:
mvn clean install
执行后打包结果targets
文件夹下的配置文件application.properties
、 application.xml
的占位置被填充。
当然如果切换profiles
下的激活项,填充的内容自然也会发生变化。或者采用maven命令进行激活项的切换:
mvn clean package -Ptest # 指定激活项的ID
实践二:
实践二主要采用profile
直接将属性配置到了profile
下的properties
节点下。此方法就不在需要多余的filter
properties文件配置了。
例如:
<profile>
<id>product</id>
<properties>
<actived.profile>product</actived.profile>
<jdbc.url>10.21.41.100</jdbc.url>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
这里properites
中多了一个jdbc.url
属性。那我们的application.properties
文件中同样适用两个占位符
app.name=${app.name}
jdbc.url=${jdbc.url}
同样执行maven
命令进行打包:
mvn clean install -Pproduct
打包之后的 application.properties
内容对应变为
结束语
整个内容写的有点乱,但是意思大概就是这个意思。主要想说maven可以搞这样一个事情。也给自己留个备忘录。如果有人来看到这个希望轻喷,我很少写东西。最近准备练习写东西,待改进的地方还是很多的,所以见谅了。
来源:https://blog.csdn.net/maoye/article/details/108674145


猜你喜欢
- 通常浏览器都有将网页生成图片的功能,本文实例讲述了Winform实现将网页生成图片的方法。分享给大家供大家参考。具体方法如下:工具截图如下:
- 前言由于大部分android初级教程都没教怎么选择时间,初学者碰到这种难免会有些不知所措,难道要让用户自己输入日期时间?先不说用户体验不好,
- 概述对象实例由对象头、实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度;| 类型 | 32位JVM | 6
- 本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下。具体功能代码如下:主要功能部分代码如下:/// <summ
- 首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetC
- Flutter中的生命周期类似于Vue、React中的生命周期一样,有初始化、状态更新、停用、销毁等。在React中,组件分为函数式组件和类
- 这篇文章主要介绍了Spring Cloud Hystrix异常处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:
- 1.pom.xml<?xml version="1.0" encoding="UTF-8"?&
- Commons Beanutils是Apache开源组
- 一、使用spring initializr创建java工程 1、启动IDEA,新建java工程,使用向导创建一个springboo
- 在实际项目开发中,对于Excel的导入导出还是很常见的需求,比如说将数据根据模板批量导入到数据库中,以及将数据库中的数据批量导出陈Excel
- 半藏商城中会有一些用户提交了订单但是一直没有支付的情况,之前我是通过quartz定时任务每天的5点扫描未支付订单然后读取用户的邮箱地址发送邮
- java中synchronized(同步代码块和同步方法)详解及区别问题的由来:看到这样一个面试题://下列两个方法有什么区别p
- BigDecimal 和 0 比较大小调用BigDecimal中的compareTo方法, 如:int i = bigDecimal.com
- 在PDF文档中,图层可以使部分内容选择性地被隐藏或显示。通过添加图层,我们可以将文本、图片、表格等元素精确定位于页面指定位置,并可将这些元素
- 一、过滤器(filter)过滤器处于客户端与Web资源(Servlet、JSP、HTML)之间,客户端与Web资源之间的请求和响应都要通过过
- 零、学习目标1、掌握application.properties配置文件2、掌握application.yaml配置文件3、掌握使用@Con
- 要求:用DateTimeFormatter实现: 用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格
- 介绍  日常的业务开发,我们会重复编写一些代码:日期和字符串相互转换、发送Http请求调用接口、拷贝对象