spring profile 与 maven profile 多环境管理

spring profile

Spring profileSpring提供的多环境管理方案。

如下图:

每种环境都对应一个yml文件,然后再application.yml中配置需要使用的环境:

  1. spring:
  2. #环境 dev|test|pro|preview
  3. profiles:
  4. active: dev

可以看出,Spring profile对配置文件的命名是有有要求的,必须是 application- 开头。

除了配置环境之外,一些不随着环境变化而变化的配置也应该放到application.yml中,application-xxx.yml的配置文件最好值存放于环境相关的配置项。

通过改变spring.profiles.active的值来切换不同的环境,这种方法简单易懂,但是其实还有两个问题:

  • 每次切换环境都要手动修改spring.profiles.active的值
  • 打包的时候需要手动删除其他的环境的配置文件,不然其他环境的敏感信息会被一起打包

为了解决这两个问题,我们需要 maven profile 的配合。

maven profile

mavenprofile可以让我们定义多套配置信息,并指定其激活条件,然后在不同的环境下使用不同的profile配置。

maven中有两个地方可以配置profile

  • pom.xml中:这里面定义的profile作用范围是当前项目。
  • (user)/.m2/setting.xml中:这里面定义的profile作用范围是所有使用了该配置文件的项目。

pom.xml中的profile

pom.xml中,profile能定义的东西就很多了

  1. <profiles>
  2. <profile>
  3. <id>..</id>
  4. <activation>...</activation>
  5. <build>...</build>
  6. <modules>...</modules>
  7. <repositories>...</repositories>
  8. <pluginRepositories>...</pluginRepositories>
  9. <dependencies>...</dependencies>
  10. <reporting>...</reporting>
  11. <dependencyManagement>...</dependencyManagement>
  12. <distributionManagement>...</distributionManagement>
  13. </profile>
  14. </profiles>

我们从spring profile遗留下来的两个问题来进行分析配置:

  1. 每次切换环境都要手动修改spring.profiles.active的值

    这个问题通过配置profile就可以解决,在pom根节点中添加:

    1. <profiles>
    2. <profile>
    3. <id>dev</id>
    4. <activation>
    5. <!-- activeByDefault为true表示,激活默认id的profile(这里是dev)-->
    6. <activeByDefault>true</activeByDefault>
    7. </activation>
    8. <!-- properties里面可以添加自定义节点,如下添加了一个env节点 -->
    9. <properties>
    10. <!-- 这个节点的值可以在maven的其他地方引用,即定义了一个叫env的变量 -->
    11. <env>dev</env>
    12. </properties>
    13. </profile>
    14. <profile>
    15. <id>test</id>
    16. <properties>
    17. <env>test</env>
    18. </properties>
    19. </profile>
    20. <profile>
    21. <id>prod</id>
    22. <properties>
    23. <env>prod</env>
    24. </properties>
    25. </profile>
    26. </profiles>

    如上可以看到,定义了三套环境,其中iddev的是默认环境,三套环境都定义了叫env的变量。

    如果用的是idea编译器,添加完成之后,maven空间窗口会多出一个profiles,其中的默认值就是设置的dev。

    这样的话,最小化的profiles已经配置好了,通过勾选上图的profiles,就可以快速切换mavenprofile环境。

    现在可以根据勾选来配置maven profile的环境,但是spring profile还得通过手动修改spring.profiles.active的值来切换,这个问题,可以这么做:

    还记得maven profile中定义的env变量吗,现在就可以进行使用了:

    1. spring:
    2. profiles:
    3. # 将maven profile和spring profile环境关联起来
    4. active: @env@

    maven profile将环境切换为test的时候,在pom中定义的idtestprofile环境被激活,在该环境下的env的值是testmaven插件会将@env@替换为test,这样spring profile的环境也随之发生了改变。

    可以看到,自定的变量env的值不能乱写,要与spring profile的环境相对应。

    总结一下:

    • 先在pom文件中配置profiles
    • 然后在application.yml配置文件中添加spring.profiles.active=@env@
  2. 打包的时候需要手动删除其他的环境的配置文件,不然其他环境的敏感信息会被一起打包

    解决这个问题,需要在pom的根节点中配置build的信息。

    1. <build>
    2. <resources>
    3. <resource>
    4. <directory>src/main/resources</directory>
    5. <excludes>
    6. <!--先排除application开头的配置文件-->
    7. <exclude>application*.yml</exclude>
    8. </excludes>
    9. </resource>
    10. <resource>
    11. <directory>src/main/resources</directory>
    12. <!--filtering 需要设置为 true,这样在include的时候,才会把
    13. 配置文件中的@env@ 这个maven`变量`替换成当前环境的对应值 -->
    14. <filtering>true</filtering>
    15. <includes>
    16. <!--引入所需环境的配置文件-->
    17. <include>application.yml</include>
    18. <include>application-${env}.yml</include>
    19. </includes>
    20. </resource>
    21. </resources>
    22. </build>
    • directory:资源文件所在目录
    • includes:需要包含的文件列表
    • excludes:需要排除的文件列表

    如上,配置了两个<resouce>,第一个resouce排除了src/main/resources目录下所有以application开头的配置文件;第二个resouce在第一个的基础上添加了所需的配置文件。

    注意application-${env}.yml它是一个动态变化的值,随着当前环境的改变而改变。比如当前环境的iddevprofile,那么env的值就是dev。

    这样配置之后,mavenbuild的时候,就会根据配置先排除掉指定的配置文件,然后根据当前环境添加所需要的配置文件。

settings.xml中的profile

由于settings.xml的作用范围广,所以profile中只能定义一些公共的信息,如下:

  1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  4. https://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. ...
  6. <profiles>
  7. <profile>
  8. <id>...</id>
  9. <activation>...</activation>
  10. <repositories>...</repositories>
  11. </profile>
  12. </profiles>
  13. ...
  14. </settings>
  • id:该profile的唯一标识
  • activation:在哪些情况下激活profile,这里有很多中策略可以选择,只要满足其中一个条件就能激活
  • repositories:远程仓库

可以看到,其实能配置的东西有限,所以一般都会配置将maven profile配置在pom.xml中。

[Java][Spring]spring profile与maven profile多环境管理的更多相关文章

  1. spring 使用 maven profile

    先看看 maven 定义 profile 的写法 <!-- profiles --> <profiles> <profile> <activation> ...

  2. Spring Boot 笔记 (1) - Maven、基本配置、Profile的使用

    一. Spring Boot 简介 开箱即用的一站式 Java EE 解决方案 Spring 技术栈的大整合 核心问题 暂时无法回答 Spring Boot 和 SOA 有什么区别? Spring B ...

  3. [Spring Boot 系列] 集成maven和Spring boot的profile功能

    由于项目的需要, 今天给spirng boot项目添加了profile功能.再网上搜索了一圈,也没有找到满意的参考资料,其实配置并不难,就是没有一个one stop(一站式)讲解的地方,所以有了写这篇 ...

  4. [Spring Boot 系列] 集成maven和Spring boot的profile 专题

    maven中配置profile节点: <project> .... <profiles> <profile> <!-- 生产环境 --> <id& ...

  5. Java & Maven & Spring & Spring Boot

    Java & Maven & Spring & Spring Boot Spring Boot sb https://start.spring.io/ Spring 4 htt ...

  6. 我把自己的java库发布到了maven中央仓库,从此可以像Jackson、Spring的jar一样使用它了

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换

                                      软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...

  8. Spring Boot 中如何配置 Profile

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  9. spring boot 环境配置(profile)切换

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  10. spring&pom两种获取profile的方式

    一.原理: 1.实现ApplicationContextAware(当一个类实现了ApplicationContextAware这个接口之后,这个类就可以通过setApplicationContext ...

随机推荐

  1. C#商品金额大小写转换

    见图 代码如下 public string NumToChinese(string x) { //数字转换为中文后的数组 string[] P_array_num = new string[] { & ...

  2. go 变量逃逸分析

    0. 前言 在 小白学标准库之 reflect 篇中介绍了反射的三大法则以及变量的逃逸分析.对于逃逸分析的介绍不多,大部分都是引自 Go 逃逸分析.不过后来看反射源码的过程中发现有一种情况 Go 逃逸 ...

  3. Postman 压力测试

    本文为博主原创,未经允许不得转载: postman 还提供了接口压力测试的功能,通过这种方式可以测试接口性能. 若接口测试需要通过pre s单独封装进行计算一些参数时,可以参考我的上一篇博客: Pos ...

  4. 13个构建RESTful API的最佳实践

    前言 Facebook.GitHub.Google和其他许多巨头都需要一种方法来服务和消费数据.在今天的开发环境中,RESTful API仍然是服务和消费数据的最佳选择之一. 但你是否考虑过学习行业标 ...

  5. JavaScript合并多个数组

    工作中经常会对数组进行合并,稍微总结一下常用的方法: concat JavaScript原生自带的函数,用法如下: let arr1 = [3, 5, 7]; let arr2 = [4, 78, 7 ...

  6. std::istringstream的用法

    1.概要 std::istringstream 是 C++ 标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型.它通常用于从字符串中解析数据,例如整数.浮点数等.以下是关于 st ...

  7. [转帖]Skip List--跳表(全网最详细的跳表文章没有之一)

    https://www.jianshu.com/p/9d8296562806 跳表是一种神奇的数据结构,因为几乎所有版本的大学本科教材上都没有跳表这种数据结构,而且神书<算法导论>.< ...

  8. [转帖]LVS入门篇(四)之LVS实战

    LVS入门篇(四)之LVS实战 https://www.cnblogs.com/linuxk/p/9360922.html 一.LVS的NAT模式实战 1.环境说明: HOST OS role rem ...

  9. [转帖]Kafka 核心技术与实战学习笔记(八)kafka集群参数配置(下)

    一.Topic级别参数 Topic的优先级: 如果同时设置Topic级别参数和全局Broker参数,那么Topic级别优先 消息保存方面: retention.ms:规定Topic消息保存时长.默认是 ...

  10. [转帖]Docker相关的概念和原理

    https://www.jianshu.com/p/9737cbe33304 chroot chroot就是可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录.Docker是利用Linux的 ...