一次打包,多个环境运行(开发、测试、生产等)

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朋友们,分享一些他们的技术见解和生活故事。

posted @ 2021-12-14 11:29  软件老王  阅读(331)  评论(0编辑  收藏  举报