Spring Boot jar 启动时设置环境参数的操作

 更新时间:2021年06月04日 11:37:07   作者:Flying9001  
这篇文章主要介绍了Spring Boot jar 启动时设置环境参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring Boot jar 启动时设置环境参数

1 摘要

通常在使用 Spring Boot 开发项目时需要设置多环境(测试环境与生产环境等),但是项目打包却只能指定一种环境,有没有一种办法,能够只打一个 jar 包,但是启动的时候指定项目环境?作者经过在网上查阅资料并测试,发现这一功能可以实现,这就大大方便了项目的部署工作(可以实现多环境自动部署)。

2 核心代码

2.1 spring Boot 多环境配置

../demo-web/src/main/resources/application.yml
## spring config
spring:
  # environment: dev|test|pro
  profiles:
    active: dev

2.2 spring Boot 项目启动命令

Linux 命令行后台启动 spring boot jar:

nohup java -jar xxx.jar --spring.profiles.active=test > /dev/null 2>&1 &

根据不同的部署环境修改 --spring.profiles.active 值即可

3 Spring boot 简易启动与停止 shell 脚本

3.1 启动脚本

../doc/script/start-springboot.sh
#!/bin/sh
# 
# 启动 jar 运行

# 项目部署目录
projectDir=/opt/springboot/
# 项目运行 jar 名称
jarName="springbootdemo.jar"
# 脚本日志目录
logDir=/var/log/springbootdemo/
# 项目部署环境
profileActive=dev

# 这里的-x 参数判断${logDir}是否存在并且是否具有可执行权限 
if [ ! -x "${logDir}" ]; then 
  mkdir -p "${logDir}" 
fi 

# 判断项目SpringBoot程序是否运行
count=$(ps -ef |grep ${jarName} |grep -v "grep" |wc -l)
if [ ${count} -lt 1 ]; then
    cd ${projectDir}
    nohup java -jar ${jarName} --spring.profiles.active=${profileActive} > /dev/null 2>&1 &
    echo "$(date '+%Y-%m-%d %H:%M:%S') 启动 ${jarName} 程序 ... ..." >> ${logDir}$(date "+%Y-%m-%d").log    
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') ${jarName} 程序运行正常 !!! !!!" >> ${logDir}$(date "+%Y-%m-%d").log
fi

3.2 停止脚本

../doc/script/stop-springboot.sh
#!/bin/sh
# 
# 停止 jar 运行

# 项目部署目录
projectDir="/opt/springboot/"
# 项目运行 jar 名称
jarName="springbootdemo.jar"
# 脚本名称
scriptName="stop-springboot.sh"

# 判断项目SpringBoot程序是否运行
count=$(ps -ef |grep ${jarName} |grep -v "grep" |wc -l)
if [ ${count} -gt 0 ]; then
    echo "已经存在 ${count} 个${jarName} 程序在运行"
    # 获取正在运行的程序进程 id(排除 grep 本身、awk 命令以及脚本本身)
    jarPid=$(ps x | grep ${jarName} | grep -v grep | grep -v '${scriptName}' | awk '{print $1}')
    # 停止正在运行的项目进程 
    kill -9 ${jarPid}
    output=`echo "正在关闭${jarName}程序,进程id: ${jarPid}"`
    echo ${output}
else
    echo '没有对应的程序在运行'
fi

# 删除  jar 包
rm -rf ${projectDir}${jarName}
# 进入 项目部署目录
cd ${projectDir}

3.3 监控 Spring Boot 项目

生产环境中如果因为各种原因从而导致项目停止运行,则此时服务器便不能对外提供服务,为了保证服务能够在无人值守的时间段内持续提供服务,实现项目的自动 修复/重启 显得尤为重要。在这里,使用一种简单粗暴的方式,项目挂掉,直接重启,通过使用定时任务执行启动脚本即可。

定时任务 crontab 简单使用,以 centOS 7 为例:

开机启动定时任务服务

systemctl enable cornd

启动定时任务

systemctl start cornd

关闭定时任务服务

systemctl stop crond

添加、编辑定时任务

crontab -e

内容如下:

00,10,20,30,40,50 * * * * /root/script/start-xxx.sh

当前定时任务意思为每 10 分钟执行一次同步脚本

cron 表达式说明:

* * * * * command(s)
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

在线生成 cron : http://cron.qqe2.com/

注意事项 : */5 * * * * 表示每 5 分钟执行一次,但是可能会在部分系统中不执行

4 Github 源码

Gtihub 源码地址 : https://github.com/Flying9001/springBootDemo

springboot项目启动参数详解

本文介绍springboot项目启动时增加启动参数的多种方式,我们都知道Spring在注入属性时可以通过@Value注解注入属性,那么@Value可以读取的范围有哪些呢?这就是本文的主要内容。

以下几种方式都可以被@Value读取到

1、java -jar -Dserver.port=8888 -Xms1024m demo.jar

这种方式增加的参数是被设置到应用的系统属性中,可以使用System.getProperty(“server.port”)获取(可以在idea的idea VM options中配置,以空格分隔)

-D(defintion)表示自定义参数

2、java -jar demo.jar --server.port=8888

这种方式增加的参数是属于命令行参数,即会从springboot启动时的main方法的String[] args中作为参数传入(可以在idea的program arguments中配置,以空格分隔)

3、从操作系统的环境变量中读取

这种方式的参数即属于操作系统方面的,比如安装jdk时设置的环境变量,定义JAVA_HOME,也可以通过System.getenv(“JAVA_HOME”)获取,(可以在idea的VM Environment variables中配置,以;分隔)

4、通过项目中配置文件bootstrap/application文件载入

这种方式是在项目中配置的方式,比较常见

以上就是常见的多种方式介绍

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java响应式编程之Reactor使用示例解析

    java响应式编程之Reactor使用示例解析

    这篇文章主要为大家介绍了java响应式编程之Reactor使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 详解SpringCloud的负载均衡

    详解SpringCloud的负载均衡

    这篇文章主要介绍了SpringCloud的负载均衡的相关资料,帮助大家更好的理解和学习使用SpringCloud,感兴趣的朋友可以了解下
    2021-03-03
  • java web实现网上手机销售系统

    java web实现网上手机销售系统

    这篇文章主要为大家详细介绍了java web实现网上手机销售系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 解决myBatis generator逆向生成没有根据主键的select,update和delete问题

    解决myBatis generator逆向生成没有根据主键的select,update和delete问题

    这篇文章主要介绍了解决myBatis generator逆向生成没有根据主键的select,update和delete问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • JVM自定义类加载器在代码扩展性实践分享

    JVM自定义类加载器在代码扩展性实践分享

    这篇文章主要介绍了JVM自定义类加载器在代码扩展性实践分享,一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化 、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接
    2022-06-06
  • 基于SpringBoot实现图片上传及图片回显

    基于SpringBoot实现图片上传及图片回显

    本篇文章主要介绍了SpringBoot如何实现图片上传及图片回显,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-08-08
  • Java中为什么this可以调用当前实例

    Java中为什么this可以调用当前实例

    本文主要介绍了为什么可以通过this关键字访问到当前对象呢,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot日程管理Quartz与定时任务Task实现详解

    SpringBoot日程管理Quartz与定时任务Task实现详解

    定时任务是企业级开发中必不可少的组成部分,诸如长周期业务数据的计算,例如年度报表,诸如系统脏数据的处理,再比如系统性能监控报告,还有抢购类活动的商品上架,这些都离不开定时任务。本节将介绍两种不同的定时任务技术
    2022-09-09
  • java实现memcache服务器的示例代码

    java实现memcache服务器的示例代码

    本篇文章主要介绍了java实现memcache服务器的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 如何修改JSON字符串中的敏感信息

    如何修改JSON字符串中的敏感信息

    这篇文章主要介绍了如何修改JSON字符串中的敏感信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论