0%

Spring 项目打不同环境的 jar 包原理

在 application.yml 中配置:

1
spring:  profiles:    active: @spring.profile@

其中, spring.profiles.active 配置项表示启用哪套环境,这里没有明确指定,而是用了占位符 @spring.profile@

不同的环境有不同的配置文件,例如以下有 dev、prod、test 三套环境:

在打包时,如果想要打 prod 环境的包,可以使用命令:

mvn clean package -Dmaven.test.skip=true -Dspring.profile=prod

打包后解压,再次查看 application.yml,占位符 @spring.profile@ 被替换成了 prod,即打包命令通过 -Dspring.profile=prod 传入的值:

1
spring:  profiles:    active: prod

原理

Spring Boot 项目通过 @..@ 指定占位符,参考文档:https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/htmlsingle/#howto-automatic-expansion-maven

我们的 Spring Boot 项目都是继承自 spring-boot-starter-parent 模块,源码中可以找到:

配置占位符为 @:

https://github.com/spring-projects/spring-boot/blob/484050347a919e15c16885b14472e557461cccc9/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml#L19

并且使用了 maven-resources-plugin 插件

https://github.com/spring-projects/spring-boot/blob/484050347a919e15c16885b14472e557461cccc9/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml#L132

查看 maven-resources-plugin 插件的文档,可以看到这个插件可以在打包时通过 “-D” 选项,对项目中的占位符进行替换:

https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

Welcome to my other publishing channels