其他
Spring Boot 项目不同环境打包配置与Shell脚本部署实践,太实用了!
本篇文章和大家分享的是Spring Boot打包并结合Shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作;
个人资料指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_publish.sh启动程序
通过application.yml中编码指定profile.active = uat方式指定 通过mvn中配置文件来区分不同环境对应的配置文件夹,人工可以手动在idea替换生成不同环境的包(推荐)
<profile>
<id> node </ id>
<properties>
<!-传递给脚本的参数值->
<activeProfile> node </ activeProfile>
<package-name> $ {scripts_packageName} </ package-name>
<boot-main> $ {scripts_bootMain} </ boot-main>
</ properties>
<activation>
<activeByDefault> true </ activeByDefault>
</ activation>
</ profile>
<profile>
<id> node1 </ id>
<properties>
<activeProfile> node1 </ activeProfile>
<程序包名称>$ {scripts_packageName} </ package-name>
<boot-main> $ {scripts_bootMain}</ boot-main>
</ properties>
</ profile>
<profile>
<id> node2 </ id>
<properties>
<activeProfile> node2 </ activeProfile>
<程序包名称> $ { scripts_packageName} </ package-name>
<boot-main> $ {scripts_bootMain} </ boot-main>
</ properties>
</ profile>
</ profiles>
<groupId> org.apache.maven.plugins </ groupId>
<artifactId> maven-jar-plugin </ artifactId>
<version> 2.6 </ version>
<configuration>
<archive>
<addMavenDescriptor>假</ addMavenDescriptor>
<manifest>
<addClasspath>真</ addClasspath>
<classpathPrefix> lib / </ classpathPrefix>
<mainClass> $ {scripts_bootMain} </ mainClass>
</ manifest>
< / archive>
<!-打包排除项->
<excludes>
<exclude> ** / *。yml </ exclude>
<exclude> ** / *。属性</ exclude>
<exclude> ** / *。xml </ exclude>
<exclude> ** / *。sh </ exclude>
</ excludes>
</ configuration>
<executions>
<execution>
<id> make -a -jar </ id>
<phase> compile </ phase>
<goals>
<goal> jar < / goal>
</ goals>
</ execution>
</ executions>
</ plugin>
<plugin>
<groupId> org.apache.maven.plugins </ groupId>
<artifactId> maven-assembly -plugin </ artifactId>
<version> 2.4 </ version>
<!-插件的配置->
<configuration>
<!-指定程序集插件的配置文件->
<描述符>
<描述符> $ {project.basedir}/src/main/assembly/assembly.xml </ descriptor>
</ descriptors>
</ configuration>
<executions>
<execution>
<id> make-assembly </ id>
<phase>包</阶段>
<目标>
<目标>单个</目标>
</目标>
</执行>
</执行>
</插件>
mainClass代理:用于指定启动main函数入口类路径,如此处的:com.sm.EurekaServerApplication 不包括摘要:排除主罐包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面 描述符描述符:用于指定程序集插件对应的assembly.xml配置文件
xsi:schemaLocation = “” http:// /maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
http://maven.apache.org/ASSEMBLY/2.0.0“ >
<id > $ {activeProfile} </ id>
<!-打包成一个用于发布的zip文件->
<formats>
<format> zip </ format>
</ formats>
<!- true:zip中生成一级目录(此处屏蔽,配合脚本需要profiles后缀)->
<includeBaseDirectory> false </ includeBaseDirectory>
<dependencySets>
<dependencySet>
<!-打包进来的zip文件的lib目录->
<useProjectArtifact>假</ useProjectArtifact>
<outputDirectory> $ {package-name} - $ {activeProfile} / lib </ outputDirectory>
<unpack> false </ unpack>
</ dependencySet>
</ dependencySets>
<fileSets>
<!-配置文件打包进zip文件的配置目录->
<fileSet>
<目录> $ {project.basedir} / src / main / profiles / $ {activeProfile} </ directory>
<outputDirectory>$ {package-name} - $ {activeProfile} / conf </ outputDirectory>
<includes>
<include> ** / * </ include>
<!-<include> *。xml </ include>->
<!-<include> *。properties </ include>->
<!-<include> *。yml </ include>->
</ includes>
</ fileSet>
<!-启动脚本打包进zip文件->
<fileSet>
<目录> $ {project.basedir} / src / main / scripts </ directory>
<outputDirectory> </ outputDirectory>
<includes>
<include> ** / * </ include>
</ includes>
<!-文件文件权限为777->
<fileMode> 777 </ fileMode>
<!-目录权限为777->
<directoryMode> 777 </ directoryMode>
<!-脚本中参数变量为pom中的值关键->
<filtered> true </ filtered>
</ fileSet>
<!-项目编译出来的jar打包进zip文件->
<fileSet>
<directory> $ {project.build.directory} </ directory>
<outputDirectory> $ {package-name} - $ { activeProfile } / </ outputDirectory>
<includes>
<include> *。jar < / include>
</ includes>
</ fileSet>
</ fileSets>
</ assembly>
格式:把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等 fileMode官员:指定脚本目录下脚本文件(这里是:shenniu_publish.sh)在linux上文件权限为777 已过滤的脚本:脚本中参数变量为pom的配置文件中属性的值(该配置,是把mvn中属性值映射生成到sh文件中,如:$ {package-name})
解压zip +启动jar包 启动jar包 停止对应jar运行 重启jar程序
java -cp java -jar
#可变参数变量
languageType = “ javac” #支持java,javac,netcore发布
#参数值由pom文件传递
baseZipName = “” $ {package-name} - $ {activeProfile} “ #压缩包名称publish-test.zip的
packagename = “ $ {package-name} ” #命令启动包名xx.jar的xx
mainclass = “” $ {boot-main} “ #java -cp启动时,指定main入口类;命令:java -cp conf; lib \ *。jar; $ {packageName} .jar $ {mainclass}
#例子
#baseZipName =“ publish-test”#压缩包名称publish-test.zip的发布
#packageName =“ publish”。罐子的XX
#固定变量
基本路径= $(光盘 `目录名称 $ 0`/; pwd)
baseZipPath = “” $ {basePath} / $ {baseZipName} .zip“ #压缩包路径
baseDirPath = ”“ $ {basePath} ” #解压部署磁盘路径
pid = #进程pid
#解压
功能 shenniu_unzip()
{
echo “解压- --------------------------------------------“
echo ”压缩包路径:$ {baseZipPath} “
如果 [!`find $ {baseZipPath} `]
然后
回显 “不存在压缩包:$ {baseZipPath} ”
else
echo “解压磁盘路径:$ {baseDirPath} /$ {baseZipName} “
echo ”开始解压...“
#解压命令
unzip -od $ {baseDirPath} / $ {baseZipName} $ {baseZipPath}
#设置执行权限
chmod + x $ {baseDirPath} / $ {baseZipName} / $ {packageName}
echo “解压完成。”
fi
}
#检测pid
function getPid()
{
echo “检测状态--------------------------- ------------------“
pid =`ps -ef | grep -n $ {packageName} | grep -v grep | awk '{print $ 2}' `
if [ $ {pid} ]
然后
回显 “运行pid:$ {pid} ”
else
echo “未运行”
fi
}
#启动程序
function start()
{
#启动前,先停止之前的
stop
if [ $ {pid} ]
then
echo “停止程序失败,无法启动“
else
echo ”启动程序-------------------------------------------- -“
#选择语言类型
read -p ”输入程序类型(java,javac,netcore),继续按回车键(要么:$ {languageType}):“ read_languageType
如果 [ $ {read_languageType} ]
则
languageType = $ { read_languageType}
fi
echo “选择程序类型:$ {languageType} ”
#进入运行包目录
cd $ {baseDirPath} / $ {baseZipName}
#分类启动
if [ “ $ {languageType} ” == “ javac” ]
则
if [ $ {mainclass} ]
然后
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&
音响
的elif [ “$ {languageType} “ == ” java“ ]
然后
nohup java -jar $ {baseDirPath} / $ {baseZipName} / $ {packageName} .jar> / dev / null 2>&1&
#java -jar $ {baseDirPath} / $ {baseZipName} / $ {packageName} .jar
elif [ “ $ {languageType} ” == “ netcore” ]
然后
#nohup dotnet运行$ {baseDirPath} / $ {baseZipName} / $ {packageName}> / dev / null 2 >&1&
nohup $ {baseDirPath} / $ {baseZipName} / $ {packageName} > / dev / null 2>&1&
fi
#查询是否有启动进度
getPid
如果 [ $ {PID} ]
然后
回声 “已启动”
#nohup日志
尾-n 50 -f $ {baseDirPath} / $ {的packageName} .OUT
别的
回声 “启动失败”
科幻
音响
}
#停止程序
功能 停止()
{
getPid
if [ $ {pid} ]
然后
回显 “停止程序------------------------------------- --------“
kill -9 $ {pid}
getPid
如果 [ $ {pid} ]
则
#stop
echo ”停止失败“
else
echo “停止成功”
fi
fi
}
#启动时带参数,根据参数执行
if [ $ {#} -ge 1]
然后
case $ {1} in
“ start”)
start
;;
“ restart”)
开始
;;
“ stop”)
停止
;;
“ unzip”)
#执行解压
shenniu_unzip
#执行启动
start
;;
*)
echo “ $ {1}无任何操作”
;;
command如下命令:
解压缩:解压并启动
start:启动
stop:停止进程
重启:重启
示例命令如:./ shenniu_publish start
“
fi
2 设置 ff = unix
3:wq
作者:Flag Counter
cnblogs.com/wangrudong003/p/10502043.html
公众号“大咖笔记”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
3000+ 道 BAT 大厂面试题在线刷,最新、最全 Java 面试题!
放弃 JDK8 中 StringBuilder,使用 StringJoiner 辅助类,真香!
最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)