#!/bin/bash
## blog:www.jxlgzwh.com
## create 2019-06-20
version="1.0.0";
appName=$2
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
## 后台启动项目 自动生成 catalina.log日志文件
function start()
{
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
nohup java -jar ./$appName -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G > catalina.log 2>&1 &
fi
}
## 停止项目
function stop()
{
appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill $appId
fi
}
##重启项目(平滑启动)
function restart()
{
# get release version
releaseApp=`ls -t |grep .jar$ |head -n1`
# get last version
lastVersionApp=`ls -t |grep .jar$ |head -n2 |tail -n1`
appName=$lastVersionApp
stop
for i in {5..1}
do
echo -n "$i "
sleep 1
done
echo 0
backup
appName=$releaseApp
start
}
function backup()
{
# get backup version
backupApp=`ls |grep -wv $releaseApp$ |grep .jar$`
# create backup dir
if [ ! -d "backup" ];then
mkdir backup
fi
# backup
for i in ${backupApp[@]}
do
echo "backup" $i
mv $i backup
done
}
## 查看项目当前状态
function status()
{
appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
if [ -z $appId ]
then
echo -e "\033[31m Not running \033[0m"
else
echo -e "\033[32m Running [$appId] \033[0m"
fi
}
function usage()
{
echo "Usage: $0 {start|stop|restart|status|stop -f}"
echo "Example: $0 start"
exit 1
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac
./test-portal.jar中没有主清单属性
使用idea2018打包了一个spring boot项目(打包为jar)
启动是报错如下:
错误原因
打包后的jar文件中的MANIFEST.MF缺少项目启动项,即没有Main-Class和Start-Class
如下:
解决方案如下
指定MANIFEST.MF路径
项目打包前
第一步 file–>project structure 弹框后选中Atifacts—> + ---->jar---->from module with dependenceis
第二步 选择一个Main Class,然后指定META-INF/MANIFEST.MF的路径为src下(注意不要放到main/java目录下,否则打成的jar中META-INF/MANIFEST.MF不含有Main-Class信息)
如果这个方案不行,那就很有可能是另一个原因
项目pom.xml文件中没有添加插件spring-boot-maven-plugin
成功结果
如果看到上面红框内容就证明没问题了
脚本使用方式
./spring-boot.sh start xxx-portal.jar
./spring-boot.sh stop xxx-portal.jar
./spring-boot.sh status xxx-portal.jar
./spring-boot.sh restart xx-portal.jar
maven-assembly-plugin
3.0.0
src/main/assembly/assembly.xml
make-assembly
package
single
org.apache.maven.plugins
maven-compiler-plugin
3.6.0
1.8
1.8
UTF-8
org.springframework.boot
spring-boot-maven-plugin
xxx-portal
使用 assembly 插件开发
1.0
tar.gz
src/main/assembly/bin
0755
src/main/resources
config
0755
*.yml
target
*.jar
src/main/resources
doc
0755
**/*
方式二:部署为Unix/Linux Service
该方式主要借助官方的spring-boot-maven-plugin创建"Fully executable" jar ,这中jar包内置一个shell脚本,可以方便的将该应用设置为Unix/Linux的系统服务(init.d service),官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。具体步骤如下:
1. 在pom.xml中引入插件:
org.springframework.boot
spring-boot-maven-plugin
true
2. 设置为系统服务
将你的应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:
sudo ln -s /var/app/app.jar /etc/init.d/app
3. 赋予可执行权限:
chmod u+x app.jar
4. 以系统服务的方式管理
接下来,就可以使用我们熟悉的service foo start|stop|restart来对应用进行启停等管理了
sudo service app start|stop
命令将得到形如Started|Stopped [PID]的结果反馈
默认PID文件路径:/var/run/appname/appname.pid
默认日志文件路径:/var/log/appname.log
这可能是我们更熟悉也更常用的管理方式。
自定义参数
在这种方式下,我们还可以使用自定义的.conf文件来变更默认配置,方法如下:
在jar包相同路径下创建一个.conf文件,名称应该与.jar的名称相同,如appname.conf
在其中配置相关变量,如:
JAVA_HOME=/usr/local/jdk
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log
安全设置
作为应用服务,安全性是一个不能忽略的问题,如下一些操作可以作为部分基础设置参考:
为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin
赋予最小范围权限:chmod 500 app.jar
阻止修改:sudo chattr +i app.jar
对.conf文件做类似的工作:chmod 400 app.conf,sudo chown root:root app.conf
参考资料
开机自启动脚本 可以参考