在 Spring 专案中,profile 是用于区分各种环境的,例如本机环境、开发环境、测试环境、正式环境等等。本文介绍一个透过 profile 来达成自动适应环境的开发与部署方式。此方法可以减少不必要的人工步骤,从开发到部署,透过指令就可以轻易完成。
你是否曾在 release day 当天,才在打包好的 war 档中,手动调整成正式环境的 application.yml / application.properties 呢 ?
又或者,整份专案只有正式环境使用的 .yml / .properties ,每当你在开发时都要自己生一份属于本机开发的 .yml / .properties,而且还要小心翼翼的不要放到 git 上呢 ?
希望本篇文章对你有帮助。
1. 开发阶段 — 準备各环境的 application.properties
首先準备好所有需要的 .properties / .yml,根据自己的需求而定。例如开发环境 (dev) 、正式环境 (prod) 等,以及一个主要的 application.properties。
application.properties 只有一行 spring.profiles.active="@activeProfile@"
注意要加上双引号,否则可能会出现
ScannerException: while scanning for the next tokenfound character '@' that cannot start any token. (Do not use @ for indentation)
开发环境与正式环境,根据你的需求而定,本文以 server.port 为例。在开发环境中,我希望使用 8888 port ,而在正式环境中使用 9999 port。
準备完成后,专案结构会像这样:
接着在 pom.xml 加入以下程式码:
<profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <activeProfile>dev</activeProfile> </properties> </profile> <profile> <id>prod</id> <properties> <activeProfile>prod</activeProfile> </properties> </profile> </profiles>
2. 开发阶段 — 设定 IntelliJ
在开发的阶段,我们必须告诉 IDE,请它套用适合本机开发环境的 profile。设定 Run Configuration,‘Active profiles’ 填入 dev
按下 Run 之后, IntelliJ 就会使用 ‘dev’ profile 执行 Spring boot 程式,程式成功在 port 8888 执行。
3. 部署阶段 - Maven
当我们开发完成,利用 mvn package / install 指令来打包时,需加入 -P 参数,告诉 maven 帮我们将 application.properties 的 '@activeProfile@' 字串替换成 ‘prod’,指令如下:
mvn clean package -P prod
我们将打包好的 war 档打开来看,可以发现 3 个 .properties 都已经打包进来
接着打开 application.properties
可以看到 @activeProfile@ 已经自动被替换成 prod 了。
接着再执行我们的 war 档
java -jar <my-artifact>.war
可以看见 Spring boot 如我们预期的使用 prod profile .
结论
透过本文介绍的方式,可以让开发人员轻鬆的在任何环境中套用 Spring 专案中的 .properties / .yml,不需要再根据环境来手动调整。当然也可以将这方法套用在 jenkins 来做 CI/CD ,在日后千百次的打包/执行/部署的过程中,能替我们节省许多成本。
帮团队节省成本,就是替帮公司赚钱。
本文範例完整程式码 https://github.com/KaiSheng714/spring-maven-profile-integration-demo