idea shell 中的函数 跳转_SpringBoot项目打包+shell脚本部署实践,太有用了

本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作;

  • profiles指定不同环境的配置
  • maven-assembly-plugin打发布压缩包
  • 分享shenniu_publish.sh程序启动工具
  • linux上使用shenniu_publish.sh启动程序

profiles指定不同环境的配置

通常一套程序分为了很多个部署环境:开发,测试,uat,线上 等,我们要想对这些环境区分配置文件,可以通过两种方式:

  • 通过application.yml中编码指定 profile.active=uat 方式指定
  • 通过mvn中profiles来区分不同环境对应的配置文件夹,人工可以手动在idea勾选生成不同环境的包(推荐)

这里我们要讲的是第二种,首先在mvn中配置如下内容:

                    node                                            node                ${scripts_packageName}                ${scripts_bootMain}                                        true                                        node1                            node1                ${scripts_packageName}                ${scripts_bootMain}                                        node2                            node2                ${scripts_packageName}                ${scripts_bootMain}                        

节点粗解:

id:用来指定不同环境配置文件所在的目录,如下我这里:

3ae53e01bd58eff35abedc7d02c8923b.png

properties:该节点中的节点是可作为参数传递给其他配置文件,如我这里的package-name节点值就可以在另外的assembly.xml或者shell脚本文件中通过${package-name}获取到,如下:

dca48cc0850b5bef93b7e858ef5d0eb0.png

activeByDefault:指定默认环境配置文件夹

maven-assembly-plugin打发布压缩包

对于springboot程序打包,可以分为jar和war,这里是jar包;有场景是咋们配置文件或者第三方等依赖包不想放到工程jar中,并且把这些文件压缩成一个zip包,方便上传到linux;此时通过maven-assembly-plugin和maven-jar-plugin就可以做到,mvn的配置如:

                org.apache.maven.plugins                maven-jar-plugin                2.6                                                            false                                                    true                            lib/                            ${scripts_bootMain}                                                                                                            **/*.yml                        **/*.properties                        **/*.xml                        **/*.sh                                                                                                make-a-jar                        compile                                                    jar                                                                                                    org.apache.maven.plugins                maven-assembly-plugin                2.4                                                                                                ${project.basedir}/src/main/assembly/assembly.xml                                                                                                make-assembly                        package                                                    single                                                                        

值得注意的地方如下几点:

  • mainClass节点:用来指定启动main函数入口类路径,如这里的:com.sm.EurekaServerApplication
  • excludes节点:排除主jar包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面
  • descriptor节点:用来指定assembly插件对应的assembly.xml配置文件

有了上面mvn配置,我们还需要assembly.xml的配置,这里提取了结合shell脚本发布程序的配置:

    ${activeProfile}                zip            false                                    false            ${package-name}-${activeProfile}/lib            false                                            ${project.basedir}/src/main/profiles/${activeProfile}            ${package-name}-${activeProfile}/conf                            **/*                                                                                                ${project.basedir}/src/main/scripts                                        **/*                                    777                        777                        true                                    ${project.build.directory}            ${package-name}-${activeProfile}/                            *.jar                        

重点节点介绍:

  • formats节点:把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等
  • fileMode节点:指定scripts目录下脚本文件(这里是:shenniu_publish.sh)在linux上文件权限为777
  • filtered节点:脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})

完成上面配置后,此时我们可以通过idea上勾选切换不同环境来打zip包,如图:

dda60a6603cda351c07acbd040a02a87.png

分享shenniu_publish.sh程序启动工具

上面步骤完成了zip格式的发布包,我们再分享下启动程序的shell脚本,该脚本具有的功能如:

  • 解压zip+启动jar包
  • 启动jar包
  • 停止对应jar运行
  • 重启jar程序

目前该shell中封装了两种启动jar命令的方式:

  • java -cp
  • java -jar

如图命令格式:

c512f98c22a2ceeb08a182a54c2d5fd1.png

来看全部的shell代码:

#!/usr/bin/env bash#可变参数变量languageType="javac" #支持 java,javac,netcore 发布#参数值由pom文件传递baseZipName="${package-name}-${activeProfile}" #压缩包名称  publish-test.zip的publishpackageName="${package-name}" #命令启动包名 xx.jar的xxmainclass="${boot-main}" #java -cp启动时,指定main入口类;命令:java -cp conf;lib*.jar;${packageName}.jar ${mainclass}#例子# baseZipName="publish-test" #压缩包名称  publish-test.zip的publish# packageName="publish" #命令启动包名 publish.jar的xx#固定变量basePath=$(cd `dirname $0`/; pwd)baseZipPath="${basePath}/${baseZipName}.zip"  #压缩包路径baseDirPath="${basePath}" #解压部署磁盘路径pid= #进程pid#解压function shenniu_unzip(){    echo "解压---------------------------------------------"    echo "压缩包路径:${baseZipPath}"    if [ ! `find ${baseZipPath}` ]    then        echo "不存在压缩包:${baseZipPath}"    else        echo "解压磁盘路径:${baseDirPath}/${baseZipName}"        echo "开始解压..."        #解压命令        unzip -od ${baseDirPath}/${baseZipName} ${baseZipPath}        #设置执行权限        chmod +x ${baseDirPath}/${baseZipName}/${packageName}        echo "解压完成。"      fi}#检测pidfunction getPid(){    echo "检测状态---------------------------------------------"    pid=`ps -ef | grep -n ${packageName} | grep -v grep | awk '{print $2}'`    if [ ${pid} ]     then        echo "运行pid:${pid}"    else        echo "未运行"    fi}#启动程序function start(){    #启动前,先停止之前的    stop    if [ ${pid} ]    then        echo "停止程序失败,无法启动"    else        echo "启动程序---------------------------------------------"        #选择语言类型        read -p "输入程序类型(java,javac,netcore),下一步按回车键(默认:${languageType}):" read_languageType        if [ ${read_languageType} ]        then            languageType=${read_languageType}        fi        echo "选择程序类型:${languageType}"        #进入运行包目录        cd ${baseDirPath}/${baseZipName}        #分类启动        if [ "${languageType}" == "javac" ]         then            if [ ${mainclass} ]             then                nohup java -cp conf:lib*.jar:${packageName}.jar ${mainclass} >${baseDirPath}/${packageName}.out 2>&1 &               #nohup java -cp conf:lib*.jar:${packageName}.jar ${mainclass} >/dev/null 2>&1 &            fi        elif [ "${languageType}" == "java" ]         then            nohup java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar >/dev/null 2>&1 &            # java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar        elif [ "${languageType}" == "netcore" ]         then            #nohup dotnet run ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 &            nohup ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 &        fi        #查询是否有启动进程        getPid        if [ ${pid} ]        then            echo "已启动"            #nohup日志            tail -n 50 -f ${baseDirPath}/${packageName}.out        else            echo "启动失败"        fi    fi}#停止程序function stop(){    getPid    if [ ${pid} ]     then        echo "停止程序---------------------------------------------"        kill -9 ${pid}        getPid        if [ ${pid} ]         then            #stop            echo "停止失败"        else            echo "停止成功"        fi    fi}#启动时带参数,根据参数执行if [ ${#} -ge 1 ] then    case ${1} in        "start")             start        ;;        "restart")             start        ;;        "stop")             stop        ;;        "unzip")             #执行解压            shenniu_unzip            #执行启动            start        ;;        *)             echo "${1}无任何操作"        ;;    esacelse    echo "    command如下命令:    unzip:解压并启动    start:启动    stop:停止进程    restart:重启    示例命令如:./shenniu_publish start    "fi

正如上面小节说的,shell中的参数 package-name,activeProfile,boot-main 都是由mvn中profiles的properties中提供,是可变的参数,脚本代码本身不需要人工去修改,只需要变的是mvn的参数即可;其实在我们生成zip包的时候,shell中的参数就被替换了,可以看zip中shell文件内容如:

ba4f8cfeb03579d9a5671d98c03ae386.png

linux上使用shenniu_publish.sh启动程序

把生成的zip上传到linux上,通过命令解压:

unzip -od eureka-server-0.0.1-node eureka-server-0.0.1-node.zip

其实shell脚本中包含有解压命令,但是我在打包时放在了zip中,所以只能通过手动解压了,当然可以调整;此时进入加压目录如此:

f9918c3fd6ea36f56e716d49b27119ab.png

注:这里第一次执行./shenniu_publish.sh脚本时候,提示了错误信息;是由于我是在windows上编辑的这个脚本,其空格等和linux上不一样,所以运行会有问题,要解决可以使用vim命令在linux把该文件转成linux格式,如下命令:

vim shenniu_publish.shset ff=unix:wq

执行完后,再来运行脚本./shenniu_publish.sh,此时有如下提示:

ea8cdfe4235f4c5262fd0c091ccde8e8.png

此刻我们文件是解压状态,因此只需要start命令启动程序即可:

75780ea442d18e7daef2537c3a87aa88.png

到这里shenniu_publish.sh脚本使用就完成了,只要脚本没有提示错误,基本都能启动jar服务;其他restart和stop命令也如此执行就行:

57e3f1ac696ef083a523c01dee86a1ae.png

可以去研究下shell代码,希望该脚本能给你带来效率和好的学习思路。

Java知音,专注于Java实用文章推送,不容错过!

来源:cnblogs.com/wangrudong003/p/10502043.html

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

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

相关文章

阅读源码的真正价值

大家好,我是Z哥。最近有位小伙伴求职遇到一些挫折,来找到我聊,其中有问到一个涉及到「阅读源码的必要性」的问题:“有很多场面试,面试官都有问到某个框架的某个功能是怎么实现的,难道真的要去看源码吗&…

vst3插件_Steinberg发布新的VST 3.7 SDK,音乐软件开发者速来围观

Steinberg日前宣布最新的VST SDK(软件开发工具包)即将面市。最新的VST 3.7引入了多项SDK接口增强功能,使VST3宿主和插件之间的集成达到了新的水平,还包括新的VST3项目生成器、改进的文档以及对MIDI 2.0的支持,还可以开…

GitHub 2017 年度报告,最受欢迎的编程语言是?

GitHub 每年都会在年度盛会中推出数据报告,其中列出了一些年度的数据,包括其网站中最受欢迎的编程语言、开源项目等。今年的数据更是让人眼前一亮,Python 这匹编程语言中的黑马,势不可挡! 编程语言之间的战争就是一场持…

python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...

1. Python和Java、PHP、C、C#、C等其他语言的对比?2. 简述解释型和编译型编程语言?3. 代码中要修改不可变数据会出现什么问题? 抛出什么异4. print 调用 Python 中底层的什么方法?5. 简述你对 input()函数的理解?6. Python解释器种类以及特点&#xf…

GraphQL:来来来,Union

Union就是把不相干的一些数据实体,合并起来,一起供外部查询。不用像webapi,完成查询不同的数据,需要多次请求。一次请求,获取多样数据,减少请求次数,这也是GraphQL的优势之一。怎么弄&#xff0…

每个程序员都应该知道的基础数论

这篇文章讨论了数论中每个程序员都应该知道的几个重要概念。本文的内容既不是对数论的入门介绍,也不是针对数论中任何特定算法的讨论,而只是想要做为数论的一篇参考。如果读者想要获取关于数论的更多细节,文中也提供了一些外部的参考文献&…

powerbi视觉对象_玩转Power BI的图片可视化

​制作可视化报告时,为了展示效果,有时候需要用图片来展示,在 Power BI 中,关于图片的自定义视觉对象主要有下面三个,利用他们可以很轻松的进行图片可视化。下面来看看这些视觉对象的效果。样本数据如下:为…

东南大学计算机网络_东南大学,2020年东南大学高考录取分数线分析

各位读者大家好,今天给大家介绍的是南京重点大学—东南大学。小编一直从事高等教育领域的写作,感兴趣的读者可以关注一下小编~1.学校基础东南大学,简称“东大”,是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&am…

Goodbye 2020,Welcome 2021 | 沉淀 2021

引言2021年,已开启二月的篇章,农历新年也张灯结彩而来,只不过要留守过年。在这辞旧迎新之际,踏入而立之年之时,正是算账的好时候,数一数今年的成长,讲一讲来年的期望,最重要的还是要…

程序员必须知道的十大基础实用算法及其讲解

本文盘点程序员必须知道的十大基础实用算法及其讲解。 算法一:快速排序算法 快速排序是由东尼霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn) 次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上&#…

sql 日期和当前日期时间差_详解PostgreSQL 如何获取当前日期时间

概述开发数据库应用或者调试代码时,经常需要获取系统的当前日期和时间,今天主要看一下 PostgreSQL 中提供的相关函数。一、当前日期CURRENT_DATECURRENT_DATE 函数用于获取数据库服务器的当前日期:postgres# SELECT CURRENT_DATE;调用该函数时…

我们只知大势将至,却不知未来已来

❈ 凯文•凯利 《必然》: 未来的一切事物的生命都将是无穷尽的升级,而且迭代的速度不断的在加速。包括看得见的事物,也包括看不见的审美观和价值观。无论你使用一项工具的时间有多长,不断的升级都会把你变成一个菜鸟,从…

c#爬虫-1688官网自动登录

背景在1688官网里面有很多信息是需要登录才能看得到的,比如商家的联系电话等等。那么我们在抓取它的网页的时候,肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。登录地址https://login.1688.com/member/signin.htm自动登录…

tensorrt轻松部署高性能dnn推理_部署环境之:tensorRT的插件

TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorFlow、Caffe、Mxnet、Pytor…

做一个网站多少钱?

「一辆车子多少钱?一个房子多少钱?」 这问题在工程师或设计师的眼里就如「一辆车子多少钱?一个房子多少钱?」,这个问题实在空泛到一个让人无法言语的境界,这也是我最常被问到的问题「做一个网站多少钱?」。…

[Abp 源码分析]多租户体系与权限验证

点击上方蓝字关注我们0.简介承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的。1.多租户的概念多租户系统又被称之为 Saas ,比如阿里云就是一个典型的多租户系统&#xff0…

生存是一种毅力

三月初回到成都,出站时还是凌晨5点多,第一次这么早站在成都的火车站,拥挤的人群和车辆,我的神志却异常的清醒,坚持不要母亲来接我. 到家洗漱后到头就睡,一觉醒来10点多,中午的成都虽不像北京那么阳光普照但也感觉暖暖的.想起在北京训练营的日子,"枯藤老树昏鸦"每天伴…

linux truncate文件,linux系统编程:用truncate调整文件大小

truncate的使用非常简单:int truncate(const char *path, off_t length);参数1:文件名参数2: 文件需要被调整的大小length 大于 文件大小, 文件后面会填充空白字节或者空洞length 小于 文件大小, 文件多出的部分,会被…

如何在 ASP.Net Core 中使用 SignalR

SignalR for ASP.Net Core 是 SignalR 的浴火重生版,允许你在 ASP.Net Core 中实现实时通讯,这里的 实时 意味着双方都能快速的感知对方发来的消息,比如:一旦 server 端有需要推送的内容将会直接 push 到 client,这和原…

搞笑动图:这些痛,只有程序员懂…

“代码上线后又追加了新特性” “在生产环境做 hotfix” “刚调稳定的系统,公司叕空降了一位架构师,叕要重构现有系统…… ” “当程序员听客户说还在用 IE 时” “当黑客拿到 root 权限之后” “代码进入循环分支后” “项目交接,客户要求开…