SpringBoot profile整合Maven profile实现多环境下配置、依赖自动切换

声明本文主要以图片的形式进行说明示例,项目代码托管链接见文末。


相关知识(简述)

SpringBoot profile:

       SpringBoot允许我们在配置文件(以application.properties示例)中通过配置spring.profiles.active=xxx,来对应激活application-xxx.properties配置,这就是SpringBoot profile。

注:spring.profiles.include也有类似的功能。

注:这里不是重点,所以一句带过。

Maven profile:

       Maven允许我们在配置文件(项目pom.xml文件或maven的settings.xml文件)中配置多个profile,并通过mvn指令或触发器指定激活那个(或哪些)profile。

注:关于maven profile的相关知识可详见https://blog.csdn.net/justry_deng/article/details/100537571


SpringBoot profile整合Maven profile实现多环境配置、依赖自动切换

声明本文以test环境与prod环境的切换进行示例。

第一步:准备SpringBoot的profile(即:准备相关配置文件)。

说明一:本人在src/main/resources下创建了两个文件夹,分别对应两个环境;然后在prod文件夹下放置了生产环
              境需要的配置,在test文件夹下放置了测试环境需要的配置。

说明二:以上图中的ftp.properties文件所示,因为已经用文件夹来区分环境了,所以无论是生产环境还是测试环境,
              关于ftp配置的配置文件名可以相同。但是为了语意更清晰,所以哪怕已经按照文件夹区分环境了,还是建
              议按照不同环境对应命名
。如,prod文件夹下的应取名ftp-prod.properties;test文件夹下的应取名
              ftp-test.properties。

 上图中prod下的ftp.properties文件,内容是:

上图中test下的ftp.properties文件,内容是:

第二步:根据自己的实际需求,在pom.xml中,准备Maven 的profile。

提示:本人只是为了示例,所以这里只是简单的一个环境引入fastjson;一个环境引入lombok。

第三步:将Maven profile与SpringBoot profile关联起来。

说明

  • 上图中的1一个自定义的环境标识参数,该参数的值应该与第一步创建的用户区分环境的文件夹名称一致。
                        这个参数两个地方用到:一是pom.xml中的resourses下被用到;而是在系统的配置文件
                        application.properties中被@key@动态取值(具体怎么取的可见下一步)。

  • 上图中的2将SpringBoot profile与Maven profile整合到一块儿的关键部分。

  • 上图中的2.1指定要打包加载的资源文件所在的根目录。默认该目录下的所有资源都会被打包。

  • 上图中的2.2:filter过滤器,只有被过滤的资源文件里面的占位符,会被对应替换。如果没有这个,那么配置文
                            件通过@key@的方式将不能获取到pom.xml里key对应的值。

  • 上图中的2.32.4因为要动态打包对应环境的资源,即:从众多资源目录中只加载我们需要的资源目录。方式
                                    有两个:一是保留需要的环境目录,然后排除不需要的环境目录;二是先排除所有目录(不
                                    管是不是我们需要的),然后再把我们需要的环境目录加进来。这里采用方式二。

第四步:在系统配置文件中application.properties中,动态获取pom.xml里的激活环
               境标识。

说明:在spring-boot-starter-parent的pom.xml中,springboot将配置文件里动态获取pom.xml文件参数值的占位符,
           由${key}替换成了@key@
。目的是:避免和SpringBoot的占位符${key}语意冲突。

第五步:测试一下。

prod测试

使用maven -clean -install -P prod-id指令,激活对应的maven profile并打包:

使用gd-gui打开生成的jar包,观察:

test测试

使用maven -clean -install -P test-id指令,激活对应的maven profile并打包:

使用gd-gui打开生成的jar包,观察:

由此可见,SpringBoot profile 整合 Maven profile成功


简单拓展

       上面的过程依赖于从Maven profile方面主动切换环境;能否从SpringBoot profile主动切换环境呢?能的!笔者之前写过一个Maven plugin来实现这个功能,不过有点瑕疵。下面介绍一种从“SpringBoot profile”方面实现切换环境切换(maven配置环境 + SpringBoot环境)的方法。

声明下面的内容是基于上面的内容的进一步改造,所以这里步骤接上一步的走。

第五步:在资源目录下创建一个环境切换触发文件。

注:位置、文件名均可随意,只要与自己的配置(见下面的步骤)对应得上就行。如:本人已env.prod对应生
       产环境。以env.test对应测试换。

第六步:使用maven profile的activation标签的file功能,设置环境触发条件。

提示pom.xml同上,不过需要在maven profle的对应位置添加如下信息:

第七步:测试一下。

prod测试

将环境标识文件重命名为对应生产环境为env.prod:

注:对于某些IDE,对文件关联处理得比较好,在修改文件名时,会对应修改其引用。但是我们这里只需要修
       改文件名,不需要将我们在pom.xml里的对应引用也改了。所以建议:先删除该标识文件,然后再按照要
      激活的环境名,新建标识文件即可
(我们只需要用到该文件的文件名,该文件有没有数据无所谓)。

注:程序运行的环境只可能是一个,所以环境标识文件也只能有一个,如果多了,那么可能出现问题。

直接使用maven -clean -install打包即可:

使用gd-gui打开生成的jar包,观察:

test测试

将环境标识文件重命名为对应测试环境为env.test:

注:对于某些IDE,对文件关联处理得比较好,在修改文件名时,会对应修改其引用。但是我们这里只需要修
       改文件名,不需要将我们在pom.xml里的对应引用也改了。所以建议:先删除该标识文件,然后再按照要
      激活的环境名,新建标识文件即可
(我们只需要用到该文件的文件名,该文件有没有数据无所谓)。

注:程序运行的环境只可能是一个,所以环境标识文件也只能有一个,如果多了,那么可能出现问题。

直接使用maven -clean -install打包即可:

使用gd-gui打开生成的jar包,观察:

拓展成功!拓展完毕

 

^_^ 如有不当之处,欢迎指正

^_^ 参考链接
               https://maven.apache.org/pom.html#Version_Order_Specification
               https://blog.csdn.net/java_collect/artic...aven_126

^_^ 测试代码托管链接
               
https://github.com/JustryDeng...Demo

^_^ 本文已经被收录进《程序员成长笔记(二)》,笔者JustryDeng

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章