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


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

    更多信息请关注公众号:「软件老王」,关注不迷路,IT技术与相关干货分享,回复关键字获取对应干货,本文版权归作者软件老王所有,转载需注明作者、超链接,否则保留追究法律责任的权利。
  • 相关阅读:
    leetcode 7:binary-tree-preorder-traversal
    leetcode 49:same-tree
    leetcode 45:maximum-depth-of-binary-tree
    leetcode 15:single number
    leetcode开始刷题!
    MFC按行读写文件,亲测有用!
    把字符串转换成整数
    数组中重复的数字
    CSS盒子模型图
    HTML5入门:HTML5的文档声明和基本代码
  • 原文地址:https://www.cnblogs.com/ruanjianlaowang/p/15686779.html
Copyright © 2020-2023  润新知