Java精选面试题 (微信小程序): 5000+ 道面试题和选择题, 真实面经 , 简历模版 ,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

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

1. profiles指定不同环境的配置

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

  • 通过application.yml中编码指定 profile.active=uat 方式指定

  • 通过mvn中profiles来区分不同环境对应的配置文件夹,人工可以手动在idea勾选生成不同环境的包(推荐)

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

 1     

  2         

  3             

 node id>  4             

  5                   6                 

 node activeProfile>  7                 

 ${scripts_packageName} package-name>  8                 

 ${scripts_bootMain} boot-main>  9              properties> 10             

 11                 

 true activeByDefault> 12              activation> 13          profile> 14         

 15             

 node1 id> 16             

 17                 

 node1 activeProfile> 18                 

 ${scripts_packageName} package-name> 19                 

 ${scripts_bootMain} boot-main> 20              properties> 21          profile> 22         

 23             

 node2 id> 24             

 25                 

 node2 activeProfile> 26                 

 ${scripts_packageName} package-name> 27                 

 ${scripts_bootMain} boot-main> 28              properties> 29          profile> 30      profiles>




















节点粗解:

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

打开网易新闻 查看精彩图片

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

打开网易新闻 查看精彩图片

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

2. maven-assembly-plugin打发布压缩包

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

 1            

  2                 

 org.apache.maven.plugins groupId>  3                 

 maven-jar-plugin artifactId>  4                 

 2.6 version>  5                 

  6                     

  7                         

 false addMavenDescriptor>  8                         

  9                             

 true addClasspath> 10                             

 lib/ classpathPrefix> 11                             

 ${scripts_bootMain} mainClass> 12                          manifest> 13                      archive> 14                      15                     

 16                         

 **/*.yml exclude> 17                         

 **/*.properties exclude> 18                         

 **/*.xml exclude> 19                         

 **/*.sh exclude> 20                      excludes> 21                  configuration> 22                 

 23                     

 24                         

 make-a-jar id> 25                         

 compile phase> 26                         

 27                             

 jar goal> 28                          goals> 29                      execution> 30                  executions> 31              plugin> 32 33             

 34                 

 org.apache.maven.plugins groupId> 35                 

 maven-assembly-plugin artifactId> 36                 

 2.4 version> 37                  38                 

 39                      40                     

 41                         

 ${project.basedir}/src/main/assembly/assembly.xml descriptor> 42                      descriptors> 43                  configuration> 44                 

 45                     

 46                         

 make-assembly id> 47                         

 package phase> 48                         

 49                             

 single goal> 50                          goals> 51                      execution> 52                  executions> 53              plugin>


































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

  • mainClass节点:用来指定启动main函数入口类路径,如这里的:com.sm.EurekaServerApplication

  • excludes节点:排除主jar包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面

  • descriptor节点:用来指定assembly插件对应的assembly.xml配置文件

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

 1 

  4     

 ${activeProfile} id>  5       6     

  7         

 zip format>  8      formats>  9      10     

 false includeBaseDirectory> 11     

 12         

 13              14             

 false useProjectArtifact> 15             

 ${package-name}-${activeProfile}/lib outputDirectory> 16             

 false unpack> 17          dependencySet> 18      dependencySets> 19 20     

 21          22         

 23             

 ${project.basedir}/src/main/profiles/${activeProfile} directory> 24             

 ${package-name}-${activeProfile}/conf outputDirectory> 25             

 26                 

 **/* include> 27                  28                  29                  30              includes> 31          fileSet> 32 33          34         

 35             

 ${project.basedir}/src/main/scripts directory> 36             

 outputDirectory> 37             

 38                 

 **/* include> 39              includes> 40              41             

 777 fileMode> 42              43             

 777 directoryMode> 44              45             

 true filtered> 46          fileSet> 47 48          49         

 50             

 ${project.build.directory} directory> 51             

 ${package-name}-${activeProfile}/ outputDirectory> 52             

 53                 

 *.jar include> 54              includes> 55          fileSet> 56      fileSets> 57  assembly>




























重点节点介绍:

  • formats节点:把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等

  • fileMode节点:指定scripts目录下脚本文件(这里是:shenniu_publish.sh)在linux上文件权限为777

  • filtered节点:脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})

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

打开网易新闻 查看精彩图片

3. 分享shenniu_publish.sh程序启动工具

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

  • 解压zip+启动jar包

  • 启动jar包

  • 停止对应jar运行

  • 重启jar程序

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

  • java -cp

  • java -jar

如图命令格式:

打开网易新闻 查看精彩图片

来看全部的shell代码:

  1  #!/usr/bin/env bash 
  2  #可变参数变量 
  3 languageType="javac"  #支持 java,javac,netcore 发布 
  4  #参数值由pom文件传递 
  5 baseZipName="${package-name}-${activeProfile}"  #压缩包名称  publish-test.zip的publish 
  6 packageName="${package-name}"  #命令启动包名 xx.jar的xx 
  7 mainclass="${boot-main}"  #java -cp启动时,指定main入口类;命令:java -cp conf;lib\*.jar;${packageName}.jar ${mainclass} 
  8
  9  #例子 
 10  # baseZipName="publish-test" #压缩包名称  publish-test.zip的publish 
 11  # packageName="publish" #命令启动包名 publish.jar的xx 
 12
 13  #固定变量 
 14 basePath=$(cd `dirname $0`/; pwd)
 15 baseZipPath="${basePath}/${baseZipName}.zip"   #压缩包路径 
 16 baseDirPath="${basePath}"  #解压部署磁盘路径 
 17 pid=  #进程pid 
 18
 19  #解压 
 20 function shenniu_unzip()
 21 {
 22     echo "解压---------------------------------------------"
 23     echo "压缩包路径:${baseZipPath}"
 24     if [ ! `find ${baseZipPath}` ]
 25     then
 26         echo "不存在压缩包:${baseZipPath}"
 27     else
 28         echo "解压磁盘路径:${baseDirPath}/${baseZipName}"
 29         echo "开始解压..."
 30
 31          #解压命令 
 32         unzip -od ${baseDirPath}/${baseZipName} ${baseZipPath}
 33
 34          #设置执行权限 
 35         chmod +x ${baseDirPath}/${baseZipName}/${packageName}
 36
 37         echo "解压完成。"
 38     fi
 39 }
 40
 41  #检测pid 
 42 function getPid()
 43 {
 44     echo "检测状态---------------------------------------------"
 45     pid=`ps -ef | grep -n ${packageName} | grep -v grep | awk '{print $2}'`
 46     if [ ${pid} ]
 47     then
 48         echo "运行pid:${pid}"
 49     else
 50         echo "未运行"
 51     fi
 52 }
 53
 54  #启动程序 
 55 function start()
 56 {
 57      #启动前,先停止之前的 
 58     stop
 59     if [ ${pid} ]
 60     then
 61         echo "停止程序失败,无法启动"
 62     else
 63         echo "启动程序---------------------------------------------"
 64
 65          #选择语言类型 
 66         read -p "输入程序类型(java,javac,netcore),下一步按回车键(默认:${languageType}):" read_languageType
 67         if [ ${read_languageType} ]
 68         then
 69             languageType=${read_languageType}
 70         fi
 71         echo "选择程序类型:${languageType}"
 72
 73          #进入运行包目录 
 74         cd ${baseDirPath}/${baseZipName}
 75
 76          #分类启动 
 77         if [ "${languageType}" == "javac" ]
 78         then
 79             if [ ${mainclass} ]
 80             then
 81                 nohup java -cp conf:lib\*.jar:${packageName}.jar ${mainclass} >${baseDirPath}/${packageName}.out 2>&1 &
 82                 #nohup java -cp conf:lib\*.jar:${packageName}.jar ${mainclass} >/dev/null 2>&1 & 
 83             fi
 84         elif [ "${languageType}" == "java" ]
 85         then
 86             nohup java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar >/dev/null 2>&1 &
 87              # java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar 
 88         elif [ "${languageType}" == "netcore" ]
 89         then
 90              #nohup dotnet run ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 & 
 91             nohup ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 &
 92         fi
 93
 94          #查询是否有启动进程 
 95         getPid
 96         if [ ${pid} ]
 97         then
 98             echo "已启动"
 99              #nohup日志 
100             tail -n 50 -f ${baseDirPath}/${packageName}.out
101         else
102             echo "启动失败"
103         fi
104     fi
105 }
106
107  #停止程序 
108 function stop()
109 {
110     getPid
111     if [ ${pid} ]
112     then
113         echo "停止程序---------------------------------------------"
114         kill -9 ${pid}
115
116         getPid
117         if [ ${pid} ]
118         then
119              #stop 
120             echo "停止失败"
121         else
122             echo "停止成功"
123         fi
124     fi
125 }
126
127  #启动时带参数,根据参数执行 
128 if [ ${#} -ge 1 ]
129 then
130     case ${1} in
131         "start")
132             start
133         ;;
134         "restart")
135             start
136         ;;
137         "stop")
138             stop
139         ;;
140         "unzip")
141              #执行解压 
142             shenniu_unzip
143              #执行启动 
144             start
145         ;;
146         *)
147             echo "${1}无任何操作"
148         ;;
149     esac
150 else
151     echo " 152     command如下命令: 153     unzip:解压并启动 154     start:启动 155     stop:停止进程 156     restart:重启 157 158     示例命令如:./shenniu_publish start 159     "
160 fi

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

打开网易新闻 查看精彩图片

4. linux上使用shenniu_publish.sh启动程序

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

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

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

打开网易新闻 查看精彩图片

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

1 vim shenniu_publish.sh
2 set ff=unix
3 :wq

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

打开网易新闻 查看精彩图片

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

打开网易新闻 查看精彩图片

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

打开网易新闻 查看精彩图片

可以去研究下shell代码,希望该脚本能给你带来效率和好的学习思路,下面是测试用例git地址,脚本在eureka-server项目中:https://github.com/shenniubuxing3/springcloud-Finchley.SR2

作者:神牛003 来源:https://www.cnblogs.com/wangrudong003/p/10502043.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有技术或摸鱼交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!在线摸鱼:https://www.yoodb.com/

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!