最近在弄一个spring boot项目,不是WEB应用,纯粹是后台应用,系统要临近部署,但是通过打jar的方式部署后有诸多不便,一个单独的jar想要修改配置文件什么的也很不方便,所以想弄一个方便靠谱的jar生成部署方案。
基本需求:
a.将项目依赖的所有第三方jar单独打包,便于区分,结构清晰。
b.部署后可以随时修改项目的配置文件,方便的进行重启、更新配置。
c.部署后的项目要生成外部日志文件,便于监控。
工具依赖:
1. intelliJ idea 2016
2. linux 系统要安装zip
步骤
1. File - Project Structure
2. 在弹出的窗口中左侧选中"Artifacts",点击"+"选择jar,然后选择"from modules with dependencies"。
3. 在配置窗口中配置"Main Class"。
4. 选择“Main Class”后,选择“copy to the output and link via manifest”,配置“Directory for META-INF/MAINFEST.MF”,此项配置的缺省值是:D:\workshop\DbUtil\src\main\java,需要改成:D:\workshop\DbUtil\src\main\resources(需要新建文件夹),如果不这样修改,打成的jar包里没有包含META-INF/MAINFEST.MF文件,这个应该是个IDEA的BUG(参考:http://stackoverflow.com/questions/15724091/how-to-run-a-jar-file-created-using-intellij-12),配置完成后如下图所示,点击OK进入下一步。(如果选择“extract to the target jar”,即把第三方jar文件,打入最终的可运行jar包时,可以不修改“Directory for META-INF/MAINFEST.MF”的配置,用缺省值即可)
5. 右键“”,选择“Create Directory”,输入目录名:libs
6. 用鼠标按住第三方jar,拖入下的libs目录下(注,可以shift+a全选,然后按住ctrl键用鼠标拖到libs目录下)
7. 用鼠标选中我们将要打出的jar包文件,点击下方“Class Path:”后面的按钮,在“Edit Classpath”窗口中,将每个第三方jar文件前加上相对路径:libs/,形成如:libs/xxx.jar的形式(注意是 / ,而不是 \),这个目录“libs”,就是前面输入的那个“libs”,这里如果第三方jar很多的话,可以在“Edit Classpath”窗口中,用鼠标选中所有第三方jar,然后Ctrl+X,把内容cut & copy到notePad++中,ctrl+h用正则行首(^)替换全部修改好,再paste到“Edit Classpath”窗口中完成后如下所示:
8. 完成后,点击OK,Apply等按钮,回到IDEA的主菜单,选择“Build - Build Artifacts”下的“Build”或者“Rebuild”即可生成最终的可运行的jar,并把第三方jar放到和此jar并行的lib目录下,用winrar打开目标jar,可以看到META-INF/MAINFEST.MF文件被正确包含,内容也正确。
打包结果: 根据以上步骤最终在项目目录下生成如下文件,可以看到项目中引用的jar包都被单独放到libs目录下了
自定义随时修改配置文件
我们解压项目jar可以看到,配置文件都被打到jar包里去了,如果我想实现可随时修改配置文件重再运行该怎么办呢?
因为jar要放到linux服务器上运行,采用了shell脚本方式解决。
建个configs目录,
把\target\classes下编译好的源码和配置文件等都放进去【注意META-INF里的文件要换,里面没有class-path】
写个service.sh脚本,可以看到每次改好配置文件后,执行脚本,都会重新再打包一次,最后再运行jar包。
这样算是解决需求了,后期再试试有没有更好的办法。
#!/bin/bash
set -e
export SPARK_MASTER_IP=127.0.0.1
export SPARK_LOCAL_IP=127.0.0.1
JARNAME="repost.jar"
MYPATH="/iflytek/software/repostRelation/"
#启动方法
start(){
cd $MYPATH
cd ./configs
zip -rq ../$JARNAME ./*
cd ..
now=`date "+%Y%m%d%H%M%S"`
exec java -Xms2048m -Xmx4092m -jar $MYPATH$JARNAME 5 >/dev/null &
#java -Xms128m -Xmx2048m -jar cmpp.jar 5 > log.log &
#tail -f result.log
ps -aux | grep $JARNAME
echo "RepostRelation Start SUCCESS!"
}
#停止方法
stopService(){
ps -ef|grep $JARNAME | awk '{print $2}' |while read pid
do
kill -9 $pid >/dev/null 2>&1 &
done
cd $MYPATH
rm *bidcheck.log >/dev/null 2>&1 &
ps -aux | grep $JARNAME
echo "RepostRelation Stoped!"
}
case "$1" in
start)
start
;;
stop)
stopService
;;
restart)
stopService
start
;;
*)
printf 'Usage: %s {start|stop|restart}\n' "$prog"
exit 1
;;
esac