Maven Profile 与 SpringBoot Profile 多环境打包指派指定环境

2023-11-01 06:30

本文主要是介绍Maven Profile 与 SpringBoot Profile 多环境打包指派指定环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、使用场景

2、Spring Boot Profile

3、Maven Profile设置

4、Spring profile与Maven Profile 融合二者,取长补短 实现 多环境打包

5、成果展现

6、总结

7、参考文章


1、使用场景

        因为实际项目之中,经常使用到针对不同环境进行相关的打包。于是趁最近一段时间比较闲。研究了一下如何是现在在多环境下打包问题。本片文章实现了基于*.properties文件及 *.yml文件的多环境打包。本片文章使用的是基于Maven的Profile,同时使用Maven的过滤器(filtering)。

      一般开发团队会有多个部署环境,如 dev 环境用于开发自测,Test环境让测试团队测试, Production 环境作为线上环境。通常不同环境的配置不同,我们希望打包时的人力消耗最少。

需要注意下:本文里面虽然都实现了*.properties和.yml文件的多环境下指定某个环境进行打包。但是有一个问题比较糟心就是基于*.properties文件类型的多环境打包时候,在application.properties文件之中中文被转换为了 Unicode码。希望其他看到此文的人能够提供好的解决方案。虽然功能可以实现指定环境直接替换,这是唯一的缺陷。

其他的.yml文件的替换很正常的。

2、Spring Boot Profile

     Spring Boot Profile 有许多的功能,这里只说管理配置的内容。Spring 加载配置的顺序如下:

  1. Jar 包外的 application-{profile}.properties
  2. Jar 包内的 application-{profile}.properties
  3. Jar 包外的 application.properties
  4. Jar 包内的 application.properties

   例如,如果我们在 application.properties 中指

spring.profiles.active = prod

则 SpringBoot 会使用 application-prod.properties 文件中的配置来覆盖 application.properties 文件中的相应配置。

3、Maven Profile设置

Maven 也提供了 Profile 支持,它允许我们在 pom.xml 中定义多个 Profile ,

每个 profile 可以指定自己的一些配置、依赖、触发条件等。例如:

<profiles><profile><id>dev</id><!-- 开发环境 --><properties><active.target.profile>dev</active.target.profile></properties></profile><profile><id>test</id><!-- 测试环境 --><properties><active.target.profile>test</active.target.profile></properties></profile><profile><id>prod_test</id><!-- 生测环境 --><properties><active.target.profile>prod_test</active.target.profile></properties></profile><profile><id>prod</id><!-- 生产环境 --><properties><active.target.profile>prod</active.target.profile></properties><activation><activeByDefault>true</activeByDefault></activation></profile>
</profiles>

上面指定了四个 profile: dev、test、prod_test、prod,其中 prod是默认启用的,当profile 被启用时,它定义的的属性、依赖等内容就会起效。这里我们定义了spring.profiles.active 属性(可以自己命名为其他的只要对应上关系即可),之后会用到。

在编译时指定 mvn clean install -Pprod 就能切换成 prod profile。

4、Spring profile与Maven Profile 融合二者,取长补短 实现 多环境打包

Maven 与 Spring Profile 的功能是有重合的,只使用一种其实就能实现多环境多配置。但它们各有千秋:

  • Spring profile 除了指定配置,还有一些其它作用(如为不同的 profile 生成不同的 bean),但每次打包前都需要手工指定启用哪个 profile
  • Maven Profile 可以通过命令行指定使用的 profile,但缺少了 spring profile 的一 些特定功能。

在 pom.xml 中定义 Profile

这里跟上面介绍的一样,定义两个/多个 profile 并为各个 profile 指定自己的属性:

<profiles><profile><id>dev</id><!-- 开发环境 --><properties><active.target.profile>dev</active.target.profile></properties></profile><profile><id>test</id><!-- 测试环境 --><properties><active.target.profile>test</active.target.profile></properties></profile><profile><id>prod_test</id><!-- 生测环境 --><properties><active.target.profile>prod_test</active.target.profile></properties></profile><profile><id>prod</id><!-- 生产环境 --><properties><active.target.profile>prod</active.target.profile></properties><activation><activeByDefault>true</activeByDefault></activation></profile>
</profiles>

在 pom.xml 中定义资源过滤

目的是为了让 maven 在构建时用 profile 中指定的属性来替换 application.properties 中的内容。

<resources><resource><directory>src/main/resources</directory><!--1 先排除所有的profile文件 --><excludes><exclude>application*.properties</exclude><!--<exclude>application*.yml</exclude>--></excludes></resource><resource><directory>src/main/resources</directory><!--2 按需复制所有需的profile文件--><filtering>true</filtering><includes>					<include>application.properties</include><include>application-${spring.profiles.active}.properties</include><!--<include>application.yml</include><include>application-${spring.profiles.active}.yml</include>--></includes></resource>
</resources>

1位置中,我们通过 excludes 来将所有的 application*.properties(application*.yml) 排除在外,这样 maven 在打包时就不会复制这些文件。毕竟我们不希望把 application-dev.properties 也包含在 prod 的 jar 包里。

2位置中,通过开启 filtering,maven 会将文件中的 #XX# 替换 profile 中定义的 XX 变量/属性。另外,我们还通过 includes 来告诉 maven 根据profile 来复制对应的 propertie(yml)文件。

用 Maven 变量指定 Spring Profile

在 application.properties 文件中加入下面这行:

# 多环境配置文件激活属性
spring.profiles.active=#active.target.profile#

这里 active.target.profile 是在 maven profile 中的 properties 定义的,而 #XX# 的语法则是上节提到的 maven filtering 替换变量的语法。

构建不同的包

mvn clean package -P<profile_name>

5、成果展现

   此你可以在你的Ide开发环境之中运行,及可以看见很方便的切换当前启动的环境。为了显示当前运行环境,写了一个controller方法返回当前运行环境

@RestController
public class HelloController {@Autowiredprivate Environment env;@RequestMapping("/hello")public String index() {return "Hello World";}@RequestMapping("/getCurrentEnv")public String getCurrentEnv(){String[] actProfile = env.getActiveProfiles();String curProfile = actProfile[0];return curProfile;}}

IDE之中运行后如下图所示:

使用打包工具打包后启动一下试一试(本次选择test环境了):

此时此目录下只有两个所需的.propertie文件

再看看打包后的jar文件之中

访问一下当前的页面

到此已经实现指定切换多环境下打包对应的环境,同时也不用在运行微服务时候指定环境啦。

示例源码所在地址:https://github.com/jianxia612/StudySampleJava/tree/master/Chapter-Muti-Profiles

6、总结

Maven profile 与 Spring profile 有自的优点,结合起来的步骤如下:

  1. 在 pom.xml 中定义多个 profile 及自己的属性
  2. 在 pom.xml 中定义 resource filtering,一方面控制 jar 中包含的资源文件, 一方面允许 @XX@ 的变量替换
  3. 在 application.properties 中指定 spring.profiles.active,值为 maven profile 中定义的属性。
  4. 构建时使用 mvn clean package -P<profile> 来指定 profile。
  5. 如果你不想使用@服务作为过滤器符号,你可以自定义一个 需要在pom里面配置即可如下
<properties><!-- delimiter that doesn't clash with Spring ${} placeholders --><!--<resource.delimiter>#</resource.delimiter>--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version>
</properties>

注意:问此还实现了基于yaml文件的过滤,示例工程之中放开对应的yaml文件,然后注释掉properties 文件即可。另外需要把yaml文件目录之中文件复制到resources下即可。

7、参考文章

Maven Profile 与 Spring Profile 管理多环境打包

Spring-Boot application.yml 文件拆分,实现 maven 多环境动态启用 Profiles

spring boot通过maven filter替换properties属性(多环境配置)

这篇关于Maven Profile 与 SpringBoot Profile 多环境打包指派指定环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/321127

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项