SpringBoot项目部署时application.yml文件的加载优先级和启动脚本

news2024/11/14 15:23:09

文章目录

  • application.yml文件的加载优先级(由高到低)
    • 第一级命令行参数
    • 第二级Jar包同级目录 /config
    • 第三级Jar包同级目录
    • 第四级classpath 下的/config
    • 第五级classpath 根路径/
    • 总结:
  • logback.xml 文件加载顺序
  • 当application.yml 和 bootstrap.yml 同时存在时
  • java jar包启动脚本
    • 最简单的启动脚本
    • 后台运行并打印日志:
    • 一个通用脚本

application.yml文件的加载优先级(由高到低)

第一级命令行参数

java -jar demo.jar --spring.config.location=/path/to/application.yml
  • 这个是在系统启动参数中直接指定,这个一般不用

第二级Jar包同级目录 /config

/path/to/demo.jar---jar包位置
/path/to/config/application.yml---配置文件位置
  • 2级与3级留做系统打包后设置通用属性,2级常用于运维经理进行线上整体项目部署方案调控,

如下是 Jar包同级目录/config的情况,在**/config**文件夹下配置了的话,会覆盖外面application.yml的配置和jar包内部的application.yml配置
在这里插入图片描述

第三级Jar包同级目录

/path/to/demo.jar---jar包位置
/path/to/application.yml---配置文件位置
  • 2级与3级留做系统打包后设置通用属性,3级服务于运维人员配置涉密线上环境

如下是Jar包同级目录的情况,会将配置的内容替换jar包里面原有的application.yml配置
在这里插入图片描述

第四级classpath 下的/config

src/main/resources/config/application.yml
  • 4级和5级用于系统开发阶段设置通用属性,4级常用于项目经理进行整体项目属性调控

第五级classpath 根路径/

src/main/resources/application.yml
  • 4级和5级用于系统开发阶段设置通用属性,5级服务于开发人员本机开发与测试

总结:

  • 多层级配置文件间的属性采用叠加并覆盖的形式作用于程序。
  • 如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
  • 如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
  • 先后加载顺序:若application 和bootstrap 在同一目录下:bootstrap先加载 application后加载

logback.xml 文件加载顺序

Spring Boot 在部署时会按照特定的顺序尝试加载 logback.xml 配置文件。以下是加载 logback.xml 的常见位置和加载顺序:

  • 外部配置文件:通过命令行参数指定的外部配置文件。例如,使用 --spring.config.location 参数指定配置文件路径。
  • 当前目录下的 /config 子目录
  • 当前目录
  • 类路径下的 /config 包
  • 类路径的根目录

logback.xml 将会按照上述顺序依次查找,并使用找到的第一个配置文件。

如果你想要指定 logback.xml 的加载位置,可以在启动 Spring Boot 应用时通过命令行参数 --spring.config.location 指定。例如:

java -jar demo.jar --spring.config.location=file:/path/to/config/

注意:

  • springboot在启动初,会加载内部的logback.xml,完全启动后,才会加载外部的logback.xml,所以最好保持两者一致

当application.yml 和 bootstrap.yml 同时存在时

  • 则bootStrap.yml 的加载顺序要于application.yml,即bootStrap.yml 会优先被加载。

原理:

  • bootstrap.yml 于应程序上下的引导阶段。
  • bootstrap.yml 由Spring ApplicationContext加载。
  • bootstrap.yml 可以理解成系统级别的⼀些参数配置,这些参数⼀般是不会变动的。
  • application.yml 可以⽤来定义应⽤级别的,如果搭配 spring-cloud-config 使用 application.yml 定义的文件可以实现动态替换。

java jar包启动脚本

最简单的启动脚本

java -jar demo.jar 

后台运行并打印日志:

#日志打印输出
nohup java -jar demo.jar >nohup.log 2>&1 &

一个通用脚本

  • jar包同级目录下创建logs文件夹
  • jar包同级目录下创建config文件夹,包含application.yml 和logback.xml 文件,给777权限
  • 脚本如下:
#!/bin/sh

# 该脚本为Linux下启动java程序的脚本
#
# 特别注意:
# 该脚本使用系统kill命令来强制终止指定的java程序进程。
# 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,
#
# 
# 根据实际情况来修改以下配置信息 ##################################

# JAVA应用程序的名称
APP_NAME=xxxx系统

BASEPATH=$(cd `dirname $0`;pwd)

# jar包名称-记得更改
JAR_NAME=demo.jar
# PID 代表是PID文件
JAR_PID=$JAR_NAME\.pid

# java虚拟机启动参数
JAVA_OPTS="-Xms512m -Xmx2048m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ParallelGCThreads=16 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"

# 根据实际情况来修改以上配置信息 ##################################


# 检查程序是否处于运行状态
is_exist() {
 # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程
 pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `

 # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
 # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
 # 如果不存在返回0,存在返回1
 if [ -z "${pid}" ]; then
  return 0
 else
   return 1
 fi
}

# ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 #########

# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
# $- 显示shell使用的当前选项,与set命令功能相同
# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
# $# 添加到Shell的参数个数
# $0 Shell本身的文件名
# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

# 服务启动方法
start() {
 is_exist
 if [ $? -eq "1" ]; then
   echo "$APP_NAME is already running pid is ${pid}"
 else
   # jar服务启动脚本
 nohup java  $JAVA_OPTS -jar -Dlogging.config=./config/logback.xml   $BASEPATH/$JAR_NAME   >> ${BASEPATH}/logs/nohup.out 2>&1 &
 
 echo $! > $JAR_PID
   echo "start $APP_NAME successed pid is $! "
   tail -100f ${BASEPATH}/logs/nohup.out
  fi
 }

# 服务停止方法
stop() {
 # is_exist
 pidf=$(cat $JAR_PID)
 # echo "$pidf" 
 echo "pid = $pidf begin kill $pidf"
 kill $pidf
 rm -rf $JAR_PID
 sleep 2
 # 判断服务进程是否存在
 is_exist
 if [ $? -eq "1" ]; then
   echo "pid = $pid begin kill -9 $pid"
   kill -9  $pid
   sleep 2
   echo "$APP_NAME process stopped!" 
 else
   echo "$APP_NAME is not running!"
 fi 
}

# 服务运行状态查看方法
status() {
 is_exist
 if [ $? -eq "1" ]; then
   echo "$APP_NAME is running,pid is ${pid}"
 else
   echo "$APP_NAME is not running!"
 fi
}

# 重启服务方法
restart() {
 # 调用服务停止命令
 stop
 # 调用服务启动命令
 start
}

# 帮助说明,用于提示输入参数信息
usage() {
   echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
   exit 1
}

###################################
# 读取脚本的第一个参数($1),进行判断
# 参数取值范围:{ start | stop | restart | status }
# 如参数不在指定范围之内,则打印帮助信息
###################################
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
 'start')
   start
   ;;
 'stop')
   stop
   ;;
 'restart')
   restart
   ;;
 'status')
   status
   ;;
 *)
   usage
   ;;
esac
exit 0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

淘宝天猫详情接口API:实现轻松购物,探索最具性价比的商品

随着电子商务的蓬勃发展,网络购物已经成为现代人日常生活中的重要部分。在这个浩瀚的电商海洋中,淘宝和天猫无疑是最为耀眼的两大平台。然而,如何在众多的商品中挑选出性价比最高的产品?淘宝天猫详情接口API为您提供了解决方案。 …

基于vue框架的班级管理系统3pdep(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:学生,班级事务,班级,成绩信息,请假,销假,班级信息,教师 开题报告内容 基于Vue框架的班级管理系统 开题报告 一、引言 随着教育信息化进程的加快,学校管理工作逐渐从传统的纸质化、人工化向数字化、智能化转变。班级作为学…

Python与自动化测试:提高软件质量和稳定性

在软件开发过程中,自动化测试是提高软件质量和稳定性的重要手段之一。Python作为一种简洁而强大的编程语言,为自动化测试提供了丰富的工具和库。本文将介绍几个常见的自动化测试案例,并提供详细的Python代码示例,帮助您更好地理解…

前端面试——js作用域

说一说JS的作用域吧 作用域的分类 作用域分为:全局作用域,函数作用域,块级作用域 作用域的特性 全局作用域: 能够让变量和函数在全局位置访问,其挂载在浏览器的window对象下面 其中var定义的变量和function函数存…

怀旧风吹到体育圈,刘翔、郭晶晶等再翻红?明星与体育冠军代言的区别!

今年奥运,怀旧风吹到了体育圈,曾经的奥运冠军如刘翔、郭晶晶等再度成为公众焦点。这段时间,刘翔频频出现在伊利、霸王茶姬等品牌的广告中,还和法国球星姆巴佩合作拍摄了小红书广告。同样备受品牌关注的还有郭晶晶,巴黎…

【Python实现全屏播放视频】

效果如下: 虽然视频比较抽象,但是确实是用python(cv2)实现的 代码: import cv2 from playsound import playsound from threading import Threaddef func1():cap cv2.VideoCapture("mp4/out.mp4") #替换为视频路径ret, frame ca…

记一次长事务方法带来的坑

文章目录 1. 沟通需求2.分析需求3. 波折起4.初版完成5.锁等待超时6.消费者超时7.总结 1. 沟通需求 产品找到我说,咱要将一波数据给更新了,因为涉及业务,就不说具体的内容了,需要支持分页滚动,校对数据后进行推送&…

无人机系统的关键技术

一、飞控系统:是无人机完成整个飞行过程的关键,决定了无人机的飞行性能和稳定性。 二、导航系统:提供无人机所需的位置、速度和飞行姿态等信息,引导无人机按照指定航线飞行。 三、动力系统:提供飞行动力,…

报表工具是开源还是商用的好?如何选择适合自己的报表工具?

在当今数字化转型的浪潮中,制作既精确又直观的报表已成为个人高效工作与企业精准沟通的核心工具。然而,面对市场上纷繁复杂的报表工具选项,选择最适合自身或企业需求的那一款,宛如漫步于迷雾笼罩的森林,挑战重重&#…

React 学习——useMemo

useMemo使用场景&#xff1a;消耗非常大的计算&#xff0c;例如递归 import { useMemo, useState } from react; // 缓存&#xff1a;消耗非常大的计算&#xff0c;例如递归 function fib(n){console.log(fib);if(n < 3)return 1;return fib(n-2) fib(n-1); }const App (…

Python开发工具PyCharm v2024.2全新发布——新增Databricks集成

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 立即获取PyCharm v2024.2正式版(Q技术交流&#xff1a;786598704&…

Spark2.x 入门:DStream 转换操作

DStream转换操作包括无状态转换和有状态转换。 无状态转换&#xff1a;每个批次的处理不依赖于之前批次的数据。 有状态转换&#xff1a;当前批次的处理需要使用之前批次的数据或者中间结果。有状态转换包括基于滑动窗口的转换和追踪状态变化的转换(updateStateByKey)。 DStre…

ThreeJs学习笔记--GUI(可视化三维改变场景)

引入gui import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";//具体的看自己本地threejs目录创建gui&#xff08;实例化gui&#xff09; // 实例化一个gui对象 const gui new GUI(); //改变/设置gui操作界面style属性 gui.domElement.style.ri…

【Protobuf】Protobuf 语法介绍

Protobuf 语法介绍 一、 字段规则二、消息类型的定义与使用1、练习——序列化后并写入文件2、练习——从文件中反序列化后打印输出 三、enum 类型1、 定义规则2、 定义时注意事项3、查看枚举类的操作方法4、 实际使用 四、Any 类型1、 介绍2、查看Any类的操作方法3、 实际使用 …

网络安全审计技术原理与应用

网络安全审计概述 概念 定义:对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作 作用:建立“事后”安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线索及证据,以便发现潜在网络安全威胁行为,开展网络安全风险分析及管理 常…

热搜第一!网易云音乐“崩了”

昨日&#xff08;19日&#xff09;&#xff0c;网易云音乐发生故障&#xff0c;迅速登上热搜&#xff0c;引发了广泛关注。 当天下午&#xff0c;有用户反映网易云音乐官网无法访问。同时&#xff0c;网易云音乐App中的会员中心、创作者中心、商城等多个功能均出现异常&#x…

陕西文无文化与韩国RB娱乐签订2000亿韩元合作备忘录

近日&#xff0c;韩国知名制作人、延世大学教授、(株)RB Entertainment 公司社长尹钟豪先生在辰海资本&#xff08;亚州&#xff09;投资有限公司董事、国标舞世界冠军获得者王煜明先生的陪同下&#xff0c;对中国文化市场进行考察调研&#xff0c;先后在北京、西安等地与当地影…

一起学习LeetCode热题100道(47/100)

47.从前序与中序遍历序列构造二叉树(学习) 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9…

nginx变量+rewrite相关功能+反向代理+openresty

目录 1、nginx变量 &#xff08;1&#xff09;内置变量 示例 &#xff08;2&#xff09;自定义变量 示例 2、nginx中的rewrite模块功能 &#xff08;1&#xff09;ngx_http_rewrite_module 模块指令 1&#xff09;if指令 示例 2&#xff09;set指令 示例​编辑 3&am…

代码随想录算法训练营day48:单调栈

目录 739. 每日温度 503.下一个更大元素II 分析&#xff1a; 42. 接雨水 本质&#xff1a; 暴力解法 分析&#xff1a; 双指针优化 单调栈 84.柱状图中最大的矩形 分析&#xff1a; 双指针&#xff1a; 单调栈 739. 每日温度 力扣题目链接(opens new window) 请根…