java项目如何配置不同环境变量 以及 原理

如何配置不同的profile

首先,一个java项目,需要有不同的环境配置,打包时,自动使用对应的配置。那么,如何实现呢?

在你的Spring Boot项目的src/main/resources目录下创建或添加一个application.yml文件。这是Spring Boot默认查找配置文件的位置。这个文件,可以添加通用的配置。

然后,还可以在同个目录下,创建如application-test.yml, application-prod.yml等文件,Spring Boot会自动识别这些profile-specific的配置文件。你可以在这些文件中,定义不同环境的参数,例如,数据库地址呀,redis缓存地址呀等。
即,src/main/resources目录下,可以有类似这样几个文件:

application.yml
application-prod.yml
application-test.yml

然后,可以application-test.yml, application-prod.yml, 声明2个变量一样,值不一样的配置。举个例子
application-test.yml:

mysql:
  url: https://xx.test.com/mysql

application-prod.yml:

mysql:
  url: https://xx.online.com/mysql

在java代码中,就可以动态使用这个url:

    @Value("${mysql.url}")
    protected String mysqlUrl;

完美。

那么,系统运行时,是如何自动使用对应的profile-specific.yml文件呢?请看下文

Profile自动切换的原理

我们从外网内,来看环境变量,是如何一层层传递到项目里的。
首先,一个java项目,一般就是docker来打包了。所以,从docker开始说起:

  1. docker打包命令,带上环境参数:
docker build -f assistant-web-api/qke/Dockerfile -t docker-registry.qiyi.virtual/mbd-ai/assistant-web-api-test:$tag . --build-arg dc_env=test

关键词,build-arg ,设置了个参数,dc_env=test

  1. Docker文件,声明要dc_env,且用于mvn命令
ARG dc_env
...
RUN mvn -T 8 -DdisableRpm=true -pl '!assistant-web-manager' clean package -Dmaven.test.skip=true -P${dc_env}

注意,-P表示设置profile

  1. pom.xml,配置不同的环境

上一步的mvn命令,加了-P,是在哪里用呢? 当然是在marven的配置文件,也就是pom.xml中。

<profiles>
        <profile>
            <id>test</id>
            <properties>
                <profile.active>test</profile.active>
                <log.env>test</log.env>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profile.active>prod</profile.active>
                <log.env>prod</log.env>
            </properties>
        </profile>
    </profiles>

上面,加了2个环境变量。每个变量,设了properties,即profile.active
这个值,哪里能用呢?

在主application.yml文件中用!

server:
  profiles:
    active: @profile.active@

定义要用哪个Profile,就根据上一步的profile.active变量来的值了。

自此,从docker打包定义的变量,就传递到了主yml文件中。这个文件,server.profiles.active是哪个值,就会用哪个子yml的配置。例如,如果是test,则会加载application-test.yml的配置!!!

开发环境中,如何切换环境

  1. 首先,marven先sync一下。sync后,勾选某个环境。
    在这里插入图片描述

  2. 接着,本地编译打包,并通过-P,指定环境变量:
    在这里插入图片描述

  3. 最后,要运行了,点击下图的右上角,有个Edit Configuration,出来弹窗,在Active Profile中,填入对应的环境变量,例如test
    在这里插入图片描述

  4. 最后,就可以点击运行了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/793573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024前端面试题之Vue3

2024前端面试题之Vue3 在面试具有五年经验的前端工程师时&#xff0c;对于 Vue 3 的掌握程度是一个重要的考核点。本文将提供一系列针对这一级别工程师的 Vue 3 面试题&#xff0c;并附上详细的解析&#xff0c;帮助面试官全面评估候选人的技术实力和项目经验。 一、Vue 3 基础…

科普文:微服务之服务网格Service Mesh

一、ServiceMesh概念 背景 随着业务的发展&#xff0c;传统单体应用的问题越来越严重&#xff1a; 单体应用代码库庞大&#xff0c;不易于理解和修改持续部署困难&#xff0c;由于单体应用各组件间依赖性强&#xff0c;只要其中任何一个组件发生更改&#xff0c;将重新部署整…

shell脚本之if/case语句

一、条件测试 1、1 返回码 $? $? :返回码&#xff0c;用来判断命令或者脚本是否执行成功。 0 &#xff1a;表示true &#xff0c;成功&#xff1b;非0 则表示flase &#xff0c;失败。 1、2 test命令 可以进行条件测试&#xff0c;然后根据返回值来判断条件是否成立 -e…

第2关 Python 基础知识

第2关 Python 基础知识 前言Python实现wordcountSSH远程连接开发机Bug记录 前言 本文是由上海人工智能实验室主办的第三期书生大模型实战营的笔记&#xff0c;仅供个人和助教批改作业参考&#xff0c;教程原文链接。 报名请在微信搜索“第三期书生大模型实战营”。 本笔记是在…

BatchNorm LayerNorm

0. Abstract 很早以前就遇到了 BatchNorm 和 LayerNorm, 当时只是粗略地知道它们是对数据进行了标准化: x x − μ σ \bm{x} \frac{\bm{x} - \bm{\mu}}{\bm{\sigma}} xσx−μ​ 这当然很简单, 但实际的数据是比较复杂的. 对于 CV 任务的数据 image 而言, 一个 batch 的数…

linux系统操作/基本命令/vim/权限修改/用户建立

Linux的目录结构&#xff1a; 一&#xff1a;在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用:/来表示 注意:1、开头的/表示根目录 2、后面的/表示层级关系 二&#xff1a;在windows系统中&#xff0c;路径之间的层级关系&#xff0c;使用:\来表示 注意:1、D:表示…

【技术追踪】HiDiff:医学图像分割的混合扩散框架(TMI-2024)

传统分割方法与扩散分割方法结合&#xff0c;做大做强~ HiDiff&#xff1a;一种用于医学图像分割的新型混合扩散框架&#xff0c;它可以协同现有判别分割模型和新型生成扩散模型的优势&#xff0c;在腹部器官、脑肿瘤、息肉和视网膜血管分割数据集上性能表现 SOTA &#xff01;…

【eNSP模拟实验】三层交换机实现VLAN通信

实验需求 让PC1和PC2能够互相通讯&#xff0c;其中PC1在vlan10中&#xff0c;PC2在vlan20中。 实验操作 首先把PC1和PC2都配置好ip&#xff0c;配置好之后&#xff0c;点击右下角的应用 然后&#xff0c;在S2交换机&#xff08;S3700&#xff09;上做如下配置 #进入系统 <…

Java基础-组件及事件处理(下)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 面板组件 说明 常见组件 JScrollPane常用构造方法 JScrollPane设置面板滚动策略的方法 JScrollPane滚…

进程调度篇

在操作系统的广阔领域中&#xff0c;进程调度是其中一个至关重要的环节。它如同操作系统的“交通警察”&#xff0c;负责在多个等待CPU执行的进程间进行高效、公平的分配。本文将带您了解进程调度的基本概念、重要性、常用算法…… 1. 进程调度的基本概念 1.1 进程调度的定义 …

HTAP 数据库在国有大行反洗钱场景的应用

导读 在金融领域&#xff0c;随着数字化服务的深入和监管要求的提高&#xff0c;反洗钱工作变得尤为关键。洗钱活动不仅威胁金融安全&#xff0c;也对社会秩序构成挑战。本文深入探讨了国产 HTAP 分布式数据库 TiDB 在某国有大行反洗钱系统中的应用实践。 依托 TiDB 构建的新…

c++初阶知识——类和对象(1)

目录 1.类和对象 1.1 类的定义 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 对象大小 内存对齐规则 3.this指针 1.类和对象 1.1 类的定义 &#xff08;1&#xff09;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xf…

python怎么调用cmd命令

关于python调用cmd命令&#xff1a; 1、python的OS模块 OS模块调用CMD命令有两种方式&#xff1a;os.popen()、os.system()都是用当前进程来调用。 OS.system是无法获取返回值的。当运行结束后接着往下面执行程序。用法如&#xff1a;OS.system("ipconfig"). OS.…

前台线程和后台线程(了解篇)

在多线程编程中&#xff0c;理解线程的不同类型对于编写高效、稳定的程序至关重要。特别地&#xff0c;前台线程&#xff08;Foreground Threads&#xff09;与后台线程&#xff08;Background Threads&#xff09;在行为上有着根本的区别&#xff0c;这些区别直接影响到程序的…

【Linux 线程】线程的基本概念、LWP的理解

文章目录 一、ps -L 指令&#x1f34e;二、线程控制 一、ps -L 指令&#x1f34e; &#x1f427; 使用 ps -L 命令查看轻量级进程信息&#xff1b;&#x1f427; pthread_self() 用于获取用户态线程的 tid&#xff0c;而并非轻量级进程ID&#xff1b;&#x1f427; getpid() 用…

(CVPR-2024)SwiftBrush:具有变分分数蒸馏的单步文本到图像扩散模型

SwiftBrush&#xff1a;具有变分分数蒸馏的单步文本到图像扩散模型 Paper Title&#xff1a;SwiftBrush: One-Step Text-to-Image Diffusion Model with Variational Score Distillation Paper 是 VinAI Research 发表在 CVPR 24 的工作 Paper地址 Code:地址 Abstract 尽管文本…

前端工程化(01):10款自动化构建工具初识。

前端工程化自动化构建工具是用于简化前端开发流程、提高开发效率和优化项目质量的工具。市面上的工具多种多样&#xff0c;贝格前端工场先介绍一下什么是前端工程化&#xff0c;为什么要前端工程化&#xff0c;以及常用工具&#xff0c;后面会对各种工具逐一介绍。 一、什么是…

【数据结构】一文了解七大排序算法

文章目录 前言一.直接插入排序插入排序思想插入排序代码实现插入排序总结 二.希尔排序希尔排序思想希尔排序代码实现希尔排序总结 三.选择排序选择排序思想选择排序代码实现选择排序总结 四.堆排序堆排序思想堆排序代码实现堆排序总结 五、冒泡排序冒泡排序思想冒泡排序代码实现…

深化信创存储 ,XEDP 与 飞腾腾云 S5000C 完成兼容性认证

近日&#xff0c;XSKY星辰天合的统一数据平台 XEDP 与飞腾信息技术有限公司的高性能服务器 CPU 飞腾腾云 S5000C 完成兼容性互认证。 经过严格的测试与评估&#xff0c;双方产品在技术上兼容良好&#xff0c;运行稳定且性能优异&#xff0c;融合双方优势构筑的软件定义存储系统…

SpringBoot实战:轻松实现接口数据脱敏

一、接口数据脱敏概述 1.1 接口数据脱敏的定义 接口数据脱敏是Web应用程序中一种保护敏感信息不被泄露的关键措施。在API接口向客户端返回数据时&#xff0c;系统会对包含敏感信息&#xff08;如个人身份信息、财务数据等&#xff09;的字段进行特殊处理。这种处理通过应用特…