maven profile动态选择配置文件详解
作者:WhyWin 发布时间:2023-11-05 22:05:20
一、背景
在开发过程中,我们的软件会面对不同的运行环境,比如开发环境、测试环境、生产环境,而我们的软件在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。
maven提供了一种方便的解决这种问题的方案,就是profile功能。
二、profile简介
profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。
profile定义的位置
(1)针对于特定项目的profile配置我们可以定义在该项目的pom.xml中。(下面举例是这种方式)
(2) 针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户家目录下的“.m2”目录下。
(3)全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件中的。
三、配置动态打包
1、配置profile
在项目的profile中添加如下的profile配置:
<profiles>
<profile>
<!-- 本地开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<!-- 设置默认激活这个配置 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 发布环境 -->
<id>release</id>
<properties>
<profiles.active>release</profiles.active>
</properties>
</profile>
<profile>
<!-- 测试环境 -->
<id>beta</id>
<properties>
<profiles.active>beta</profiles.active>
</properties>
</profile>
</profiles>
这里定义了三个环境,分别是dev(开发环境)、beta(测试环境)、release(发布环境),其中开发环境是默认激活的(activeByDefault为true),这样如果在不指定profile时默认是开发环境,也在package的时候显示指定你要选择哪个开发环境,详情见后面。
2、配置文件
针对不同的环境,我们定义了不同的配置文件,文件目录如下:
如图所示,开发环境、测试环境、生产环境的配置文件分别放到src/main/resources目录下的config文件夹下。
config下有多个环境的配置文件,命名规则为是application-环境名称.properties。
处理过程:
1)通过profile选中你要使用的环境
2)通过package命令,将环境变量注入到application.properties中(这样子,那些公用的环境变量就不用在各个环境的配置文件中配置了)
3)项目中加载application.xml文件
加载配置文件
<context:property-placeholder location="classpath:application.properties"/>
例子:
application-beta.properties文件有如下部分内容:
env.datasource.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&zeroDateTimeBehavior=round
env.datasource.username=root
env.datasource.password=12233
application.properties有部分如下内容用于注入上面的内容:
datasource.jdbcUrl=${env.datasource.jdbcUrl}
datasource.username=${env.datasource.username}
datasource.password=${env.datasource.password}
3、maven资源插件配置
在pom.xml的build结点下,配置资源文件的位置,如下所示:
<build>
<finalName>seewo-admin</finalName>
<!-- 定义了变量配置文件的地址 -->
<filters>
<filter>src/main/resources/config/application-${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
</plugin>
</plugins>
</build>
这里注意一个参数<filtering>true</filtering>,一定要设置成true.这样才会用对应env目录下的配置文件覆盖原来的。
4、激活profile
1)默认的激活
上面的profile配置中设置的默认的激活环境。如下面所示
<activeByDefault>true</activeByDefault>
2)使用-P参数显示激活一个profile
当我们在进行Maven操作时就可以使用-P参数显示的指定当前激活的是哪一个profile了。比如我们需要在对项目进行打包的时候使用id为dev的profile,我们就可以这样做:
mvn package –Pdev
这里假设dev是在settings.xml中使用dev标记的处于激活状态的profile,那么当我们使用“-P !profile”的时候就表示在当前操作中该profile将不处于激活状态。
5、调用
private Logger logger = LogManager.getLogger(MyApp.class.getName());
其他的使用和log4j的是一样的。
四、遇到的坑
在application.xml文件中不能出现@关键字,就算你注释了也不行。当出现@了,之后的所有环境变量将不会被注入
如:
来源:https://www.cnblogs.com/0201zcr/p/6262762.html
猜你喜欢
- 当键盘敲下后退键(Backspace)后1、禁止浏览器自动后退2、但不影响密码、单行文本、多行文本输入框等的回退操作<script t
- 问题分析疑惑满满小枫听到这个面试题的时候,心想这是什么水面试官,怎么问这么简单的题目,心想一个for循环加上equal判断再删除不就完事了吗
- @ModelAttribute在父类、子类的执行顺序被 @ModelAttribute 注解的方法会在Controller每个方法执行之前都
- 一、实验目的1. 掌握输入输出流的总体结构;2. 掌握流的概念;3. 掌握FileInputStream类、FileOutputStream
- java读取文件内容,解析Json格式数据一、读取txt文件内容(Json格式数据) public static
- 一. 安装依赖包yum install -y wgetyum install -y gcc-c++yum install -y zlib-d
- 一、Java内存区域方法区(公有):用户存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。异常状态 OutOfMem
- 0 实验环境在Android Studio中进行有关代码的编写和界面效果展示。SQLite数据库的图形化工具SQLiteStudio下载网址
- 1、maven引入quartz包<!-- https://mvnrepository.com/artifact/org.quartz-
- 通过本篇文章主要给大家讲解了在JAVA开发中Servlet3.0异步处理遇到的问题以及处理办法,以下是具体内容:Servlet 3.0 开始
- 一、定时任务的使用场景和常见的定时任务某个时间定时处理某个任务、发邮件、短信、消息提醒、订单通知、统计报表等定时任务划分单机定时任务:单机的
- Gradle和Maven都是当前热门的自动化构建工具。使用Gradle去构建项目,由于没有办法像Maven一样配置Setting文件来修改本
- 上帝之火本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼。每次我都能联想到带来上帝之火的希腊之神,普罗米修斯。而这
- 问题背景: 我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该
- 一般对于业务复杂的流程,会有一些处理逻辑不需要及时返回,甚至不需要返回值,但是如果充斥在主流程中,占用大量时间来处理,就可以通过异步的方式来
- timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有
- 线程可以划分优先级,优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。设置线程优先级有助于帮助线程规划器
- 开发项目的时候,表很多,是不可能一点点的自己去写xml ,dao文件的,这里就需要用到代码的自动生成工具了。第一步:导入jar包,当然,这之
- 同步代码块基本语句synchronized (任意对象) {操作共享代码}代码示例public class SellTicket imple
- 如下所示:import org.apache.commons.lang.StringUtils; public class Test {