1、问题描述
以前常用的,使用maven插件根据不同环境(开发、测试、线上)打不同的包,方便吧? 也还可以,但是打各个环境的包配置文件不一样(maven打包是指定了编译配置文件,未指定不会打包进来),有时候包会出现混淆,影响使用;最近使用了jar启动命令指定profiles文件,个人感觉更加合理一些,不使用maven插件打包,就打一个包,在不同的环境下,配置不同的启动参数就可以了,启动命令只需配置一次,一个包,就能用到不同的环境,开发、测试、线上环境都可以用,简单介绍下。
2、解决方案
简单来说就是使用jar启动命令的时候,指定不同的profiles,来达到一次打包,多个环境共用的目的。
2.1 application.yml简要说明
(1)application.yml是默认加载使用的配置文件,里面的配置项会默认加载;
(2)通过新建多个yml,application-dev.yml,application-uat.yml,application-prod.yml,在application.yml中或java启动的时候配置,可以激活具体自定义yml;
例如:
spring:
profiles:
active: dev
项目会加载application.yml和application-dev.yml中的配置项;
springboot2.4(2020-11-12发布)后版本,配置有点不一样了,更改为:
spring.config.activate.on-profile=dev
(3)后缀名字要保持一致,否则会报找不到具体配置项目(不会报找不到yml);
(4)假如application.yml配置项与自定义yml(application-dev.yml等)一样,以自定义yml配置项为准;
2.2 配置
(1)application.yml配置
spring:
profiles:
active: dev
server:
port: 9090
test:
app: 我是公共的application
(2)application-dev.yml配置
test:
name: dev老王是帅哥
(3)application-prod.yml配置
test:
name: prod老王是靓仔
2.3 新建测试controller方法
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${test.name}")
private String name;
@Value("${test.app}")
private String app;
@RequestMapping("/")
public String test() {
return app + "-------------" + name;
}
}
2.4演示
(1)当active:dev
由展示可以看出:展示了application.yml和application-dev.yml配置项内容;
(2)active:prod的时候:
由展示可以看出:展示了application.yml和application-prod.yml配置项内容;
简单总结:
(1)当时active选择为:dev的时候,会加载application.yml和application-dev.yml两个配置类;
(2)当时active选择为:prod的时候,会加载application.yml和application-dev.yml两个配置类;
利用这个特性,实现编译打包一次,多个环境运行的目的;
2.5 一次打包多个环境运行
其实是利用java的jar包设置启动参数的来实现的,dev服务器环境运行命令:
nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=dev /usr/local/application/laowang/laowang.jar LAOWANG>/dev/null 2>&1 &
其中-Dspring.profiles.active=dev,作用就是与配置文件配置active一样,并且启动命令中设置参数,级别高于配置文件中,目前正在使用的:配置文件中默认为dev,然后打包,根据不同服务器环境配置不同的启动参数,例如目前uat环境为:
nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=uat /usr/local/application/laowang/laowang.jar LAOWANG>/uat/null 2>&1 &
prod环境为:
nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=prod /usr/local/application/laowang/laowang.jar LAOWANG>/prod/null 2>&1 &
重点说明:
(1)这个方式不同于以前maven打包的环境,以前通过maven插件打包博客介绍过,是在编译打包的时候就指定了打包的yml,指定dev环境的时候,application-uat.yml和application-prod.yml压根就不会编译和打包,这样各个服务器的启动命令也一样;但是也导致各个环境的包不一样,有时候会搅浑,甚至打包的时候切换也容易出问题;
(2)目前的通过启动命令执行配置文件的方式,启动命令在服务器上更新记录一次就好了,然后打包的时候,就可以实现多个环境(开发、uat、线上)同一个jar包,不容易混淆,个人认为更加合理一些;
更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。