项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境。如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要。

maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包,比如测试环境:mvn package -DskipTests -P test,-P也就是指定profile里面id为test的子项配置来打包。在pom文件里面,可以指定多套配置文件,下面例子中区分了三套配置文件,不指定-P则默认为dev。其中的env相当于属性文件中的env=test,也可以多指定多个属性,看实际需要。至于为什么不在相应的属性文件中添加类似env这样的配置,下文会提到。

   <!-- 区分环境打包 -->
<profiles>
<!-- 开发环境[默认] -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<!-- 线上环境 -->
<profile>
<id>product</id>
<properties>
<env>product</env>
</properties>
</profile>
</profiles>

resources和filters,maven中的这两个属性通常是搭配起来使用的,filter这里可以理解为筛选器或者填充器。filters里面可以配置多个filter,但是会以最后一个为准,所以一般只配置一个filter,看下面例子。例子有${env},打包的时候,根据-P test指定,-P 后面的参数与<profile>的<id>一一对应,再根据此ID,到<profile> 的 <properties>得到env属性值,即<env>test</env>。上文指定了三套配置,所以项目里面也需要有这三个配置文件:dev.properties , test.properties , product.properties

    <filters>
<filter>src/main/resources/${env}.properties</filter>
</filters>

然后是resources

  1. directory属性指定资源文件放置的目录。
  2. includes则是指定打包时,需要打到jar/war包里的配置文件。下面例子是说需要把src/main/resources目录下的所有的xml配置文件和init.properties属性文件打到包里,所以dev.properties,test.properties,product.properties这三个属性文件不会出现在[jar/war]包文件里
  3. filtering如果设置为false的话,则表示上文的filters配置失效;如果设置为true,则会根据${env}.properties里面的键值对来填充includes指定文件里的${xxxx}占位符。
    <!-- 指定资源文件目录 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 设置为true,则init.properties会根据${env}.properties里面的配置来填充 -->
<filtering>true</filtering>
<includes>
<include>*.xml</include>
<include>init.properties</include>
</includes>
</resource>
</resources>

最后演示一下打包运行的结果,假设init.properties里有这么几行:

###########################mysql#################################################
pool.driverClassName=${pool.driverClassName}
pool.url=${pool.url}
pool.username=${pool.username}
pool.password=${pool.password}
pool.maxWait=${pool.maxWait}
# env的属性在这里也有效
env=${env}

test.properties属性文件里是如下配置,注意没有pool.maxWait配置

###########################mysql#################################################
pool.driverClassName=com.mysql.jdbc.Driver
pool.url=jdbc:mysql://192.168.100.23:3306/etmis
pool.username=root
pool.password=123456

则运行打包命令[mvn package -DskipTests -P test]之后,init.properties会被填充为:

###########################mysql#################################################
pool.driverClassName=com.mysql.jdbc.Driver
pool.url=jdbc:mysql://192.168.100.23:3306/etmis
pool.username=root
pool.password=123456
pool.maxWait=${pool.maxWait}
# env的属性在这里也有效
env=test
pool.maxWait不会被填充,因为在test.properties属性文件里面没有这个键值对。在xml文件里面的筛选填充也是一样,会根据文件中的${xxxx}占位符来筛选处理。
<profile>里面配置的属性和${env}.properties里面的属性如果有冲突,比如test.properties里面也配置了【env=testaaaa】,会优先使用<profile>里面的

maven 根据profile,resources,filters来区分部署环境的更多相关文章

  1. maven根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  2. [转]Maven中profile和filtering实现多个环境下的属性过滤

    背景 项目构建的时候,需要根据不同的场景来改变项目中的属性资源,最为常见的莫过于数据库连接配置了,试想有生产环境.测试缓存.发布环境等,需要为不同的场景下来动态的改变数据库的连接配置.而使用maven ...

  3. 基于maven的profile实现动态选择配置文件

    需求 根据选择不同的部署环境自动替换相关配置变量,如连接的数据库等. 最终效果概览 部署环境分为dev和release 工程目录结构 myproject |-profile | |-dev | | | ...

  4. Maven之profile实现多环境配置动态切换

            一般的软件项目,在开发.测试及生产等环境下配置文件中参数是不同的.传统的做法是在项目部署的时候,手动修改或者替换这个配置文件.这样太麻烦了,我们可以用Maven的profile来解决这 ...

  5. 【maven】Maven根据Profile读取不同配置环境配置文件

    开发需求:在日常开发中,我们大多都会有开发环境(dev).测试环境(test).生产环境(product),不同环境的参数肯定不一样,我们需要在打包的时候,不同环境打不同当包,如果手动改,一方面效率低 ...

  6. maven 利用 profile 进行多环境配置

    我们在进行项目的多环境配置时,有很多种方式供我们选择,比如 SpringBoot 自带的 application-dev.yml.maven 的 profile 等.这里介绍的就是如何利用 profi ...

  7. maven中profile的使用

    转载:https://blog.csdn.net/java_collect/article/details/83870215 前言       在开发过程中,我们的项目会存在不同的运行环境,比如开发环 ...

  8. Spring boot项目maven的profile多环境配置不自动替换变量的问题解决

    Spring boot项目maven的profile多环境配置不自动替换变量的问题解决   在网上找了好久,配置都很简单,可是我的程序就是不能自动替换变量,最终单独测试,发现原来是引用spring b ...

  9. 使用maven的profile切换项目各环境的参数

    Java后端开发经常需要面对管理多套环境,一般有三种环境:开发,测试,生产. 各个环境之间的参数各不相同,比如MySQL.Redis等不同环境的host不一样,若每个环境都手动替换环境很容易出错,Ma ...

随机推荐

  1. UVa 247 Calling Circles (DFS+Floyd)

    题意:如果两个人互通电话,那么他们就在一个电话圈里,现在给定 n 个人,并且给定 m 个通话记录,让你输出所有的电话圈. 析:刚开始没想到是Floyd算法,后来才知道是这个算法,利用这个算法进行连通性 ...

  2. WebDriver高级应用——操作Web页面的滚动条

    目的: (1)滑动页面的滚动条到页面最下方 (2)滑动页面的滚动条到页面某个元素 (3)滑动页面的滚动条向下移动某个数量的像素 测试的网址: http://www.seleniumhq.org/ 代码 ...

  3. 深入解析String#intern

    转自:https://tech.meituan.com/in_depth_understanding_string_intern.html 深入解析String#intern john_yang ·2 ...

  4. B-spline Curves 学习之B样条曲线的系数计算与B样条曲线特例(6)

    B-spline Curves: Computing the Coefficients 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关 ...

  5. Vivado 2017封装自定义IP Core

    使用Vivado2017.3自定义IP Core.通常情况下,我们做设计采用模块化设计,对于已经设计好的一部分模块功能,就可以直接拿来调用,IP Core就是这样来的,一般来说我们看不到IP Core ...

  6. Python学习-12.Python的输入输出

    在Python中,输出使用print函数,之前用过了. 输入的话,则使用input函数. var = input() print('you input is' + var) 输入haha则将输出you ...

  7. TSQL--INT转换成指定长度字符串

    -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ...

  8. Caffe任务池GPU模型图像识别

    一开始我在网上找demo没有找到,在群里寻求帮助也没有得到结果,索性将网上的易语言模块反编译之后,提取出对应的dll以及代码,然后对照官方的c++代码,写出了下面的c#版本 /*** * @pName ...

  9. php如何进行多进程与异步调用方法

    浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接. 这样就出现了一个问题,一个客户端的相应服务端可能 ...

  10. django 模型中 class Meta 内 各种属性的用法

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应数据库表的 ...