部署springboot项目+配置启动、停止、重启脚本
一.在Linux环境下部署springboot项目
1、把springboot项目打成jar包,使用maven插件实现
1.1、引入maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.2、在项目的pom文件里添加项目的打包方式 :jar
<packaging>jar</packaging>
1.3、点击IDEA右侧工具栏的Maven --> clean (清除项目里多余的文件)
1.4、点击package
1.5、找到项目里的target文件,找到项目,右击项目–>Show in Explorer,找到已经打好的项目jar包
2、把项目jar包上传到linux服务器对应的目录中(我这里使用的是winscp,可以显示文件目录结构,辅助开发)
3、在linux配置springboot项目的运行环境(jdk,maven等环境)
我配置的位置如下(可自定义)
3.1、JDK配置
3.1.1、下载JDK,jdk-8u161-linux-x64.tar.gz(到官网中下载即可)
3.1.2、把下载好的JDK压缩包上传到linux,并使用Linux命令解压,放至指定目录位置
tar -zxvf jdk-8u161-linux-x64.tar.gz
3.1.3、在配置文件中,配置JDK和JRE环境变量(/etc/profile),vi /etc/profile
注意:可使用notepad++实现对Linux中文件的编辑
3.1.4、配置完成之后保存,设置一下文件权限,让各个用户都可执行(貌似也无需设置)
chmod 755 /etc/profile
3.1.5、更新配置文件,使其配置生效
source /etc/profile
3.1.6、执行 java -version验证maven配置是否生效(至此完成)
3.2、Maven配置
3.2.1、下载Maven
拉取,下载压缩包文件
wget https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
解压maven
tar -zxvf apache-maven-3.3.9-bin.tar.gz
以下步骤与jdk一致
3.2.2、使用source /etc/profile命令使文件配置生效
3.2.3、执行mvn -v验证maven配置是否生效
我的配置文件(完整):
# /etc/profile
export JAVA_HOME=/export/servers/jdk
export PATH=.:$JAVA_HOME/bin:$PATH
export HADOOP_USER_NAME=hdfs
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
set java environment
JAVA_HOME=/usr/local/java/jdk1.8.0_161
JRE_HOME=/usr/local/java/jdk1.8.0_161/jre
MAVEN_HOME=/usr/local/maven/apache-maven-3.3.9
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
#export,加载以上的配置文件,使其生效
export JAVA_HOME JRE_HOME MAVEN_HOME CLASS_PATH PATH
也可
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export JRE_HOME=/usr/local/java/jdk1.8.0_161/jre
export MAVEN_HOME=/usr/local/maven/apache-maven-3.3.9
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
3.2.4、创建Maven本地仓库
mkdir -p /usr/local/repository
3.2.5、修改maven的setting文件
vim $MAVEN_HOME/conf/settings.xml
找到标签配置Maven的本地仓库地址
<localRepository>/maven/repository</localRepository>
找到标签,添加阿里云镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3.3、开启项目运行的端口号(查看端口开发情况:firewall-cmd --list-ports),这一步貌似不需要操作
firewall-cmd --zone=public --add-port=8080/tcp --permanent
3.4、进入项目所在路径,使用 java -jar 项目名.jar 命令访问项目,便可启动项目
使用Ctrl+C退出时,项目也会同时断掉
java -jar springboot-shiro.jar
需使用
nohup java -jar springboot-shiro.jar
-
定义: nohup 是 no hang up 的缩写,就是不挂断的意思,但没有后台运行,终端不能标准输入
-
用途:不挂断地运行命令。 该命令可以在你退出当前用户/关闭终端之后继续运行相应的进程 因为普通胡勇退出时候,程序可能被杀死
-
语法:nohup +命令
描述:nohup 命令运行由 Command 参数和任何相关的 Arg
参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。 -
总结:nohup: 就是防止当前系统用户退出时候,该程序被杀死,也就是关闭程序
在浏览器中输入http://192.168.58.128:6001/login/ajaxWebLogin,即可访问
二.linux下配置springboot项目启动、停止、重启脚本
如果执行脚本时提示,或者是类似的中文意思:
-bash: ./start.sh: /bin/sh^M: bad interpreter: No such file or directory
这个是编码格式的问题,进入文件后,输入:set ff 发现提示的为doc,这是你需要通过:set ff=unix 修改文件的格式
为什么要配置启动脚本?
一般情况下我们在linux下启动我们项目都是直接java -jar 启动jar包或者war包,但是其存在很多弊端,比如说不能后台一直启动项目,想返回至别的目录点击control +c 直接结束进程了,还有就是每次启动必须输入一大串包名。所以这里我们就配置一个脚本,让项目启动这个脚本使其实现启动、停止、重启项目的功能,提高我们项目部署的效率
配置脚本(单个启动jar包)
1、选择一个文件夹新建一个XXX.sh文件(xxx可以命名为项目名称,新建.sh .conf 等文件用到的是vi指令)
startHibernate.sh
2、进入如下页面,按下键盘 i 键进入insert模式(更多命令,可搜索度娘)
3.添加如下配置(只需修改APP_NAME内容为自己想要启动的jar包)
插入之后需要给予改脚本权限 用 chmod +x xxx.sh命令 不然会提示没有权限
chmod +x startHibernate.sh
#!/bin/bash
#vi 脚本:
#1.set ff,查看文件格式,
#2.修改文件格式为 unix即可,底行模式下输入 set ff=unix
#执行的程序
APP_NAME=springboot-quartz-0.0.1-SNAPSHOT.jar
#jar包或者程序所在的路径,可以写死,或者使用pwd命令获取。使用pwd命令要注意一定要加上``这个引号
APP_DIR=`pwd`
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh sms.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
# 获取进程编号,并将进程编号赋值给pid变量
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#输出进程编号
echo "ps number is: ${pid}"
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_DIR/$APP_NAME > $APP_DIR/log.out 2>&1 &
#nohup java -jar $APP_DIR/$APP_NAME
echo "${APP_NAME} start success"
echo "${APP_NAME} 启动完成 start success"
fi
}
#停止方法,同样先调用is_exist方法看程序是否在运行,运行使用命令杀死进程,没有运行输出序没有在运行。
stop(){
#调用is_exist看进程号是否存在
is_exist
if [ $? -eq "0" ]; then
#存在 使用命令杀掉此程序的进程,pid在is_exist已经获取
kill -9 $pid
else
#不存在 输出程序没有在运行
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#输入方法:根据输入参数,选择执行对应方法,不输入则执行使用说明
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
4.脚本代码含义如下:
APP_NAME:表示你要执行的jar包
APP_DIR:jar包或者程序所在的路径,可以写死,或者使用pwd命令获取。使用pwd命令要注意一定要加上``这个引号。
使用命令ps -ef 来查看进程并获取进程编号
启动:先调用第二步的is_exist看进程号是否存在,存在就输出已经在运行,不存在的话使用nohup进行启动并输出到sms.txt文件下
is_exist(){
#获取进程编号,并将进程编号赋值给pid变量
pid=ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'
#输出进程编号
echo “ps number is: KaTeX parse error: Expected 'EOF', got '#' at position 9: {pid}" #̲如果不存在返回1,存在返回0 …{pid}” ]; then
return 1
else
return 0
fi
}
停止:同样先调用is_exist方法看程序是否在运行,运行使用命令杀死进程,没有运行输出序没有在运行。
#停止方法
stop(){
#调用is_exist看进程号是否存在
is_exist
if [ $? -eq “0” ]; then
#存在 使用命令杀掉此程序的进程,pid在is_exist已经获取
kill -9 KaTeX parse error: Expected 'EOF', got '#' at position 12: pid else #̲不存在 输出程序没有在运行 …{APP_NAME} is not running"
fi
}
重启先调用st停止方法,再调用启动方法。
#重启
restart(){
stop
start
}
输入方法:根据输入参数,选择执行对应方法,不输入则执行使用说明
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case “$1” in
“start”)
start
;;
“stop”)
stop
;;
“status”)
status
;;
“restart”)
restart
;;
*)
usage
;;
esac
5.linux下脚本测试
5.1.启动测试
5.2.查看状态
5.3.停止测试
5.4.重启测试
6.Linux 批量启动jar的脚本如下
#!/bin/bash
#vi 脚本:
#1.set ff,查看文件格式,
#2.修改文件格式为 unix即可,底行模式下输入 set ff=unix
#执行的程序
APP_NAME=springboot-quartz-0.0.1-SNAPSHOT.jar
# jar包数组
JARS=(springboot-shiro.jar springboot-linux-0.0.1-SNAPSHOT.jar hibernate-springboot02-0.0.1-SNAPSHOT.jar springboot-quartz-0.0.1-SNAPSHOT.jar)
#jar包或者程序所在的路径,可以写死,或者使用pwd命令获取。使用pwd命令要注意一定要加上``这个引号
APP_DIR=`pwd`
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh sms.sh [start:启动程序|stop:关闭程序|restart:重启程序|status:查看程序状态]"
exit 1
}
#启动方法
start(){
local JAR_NAME=
for((i=0;i<${#JARS[@]};i++))
do
JAR_NAME=${JARS[$i]}
#检查程序是否在运行
#获取进程编号,并将进程编号赋值给pid变量
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在则启动jar包,存在则打印相关信息
if [ -z "${pid}" ]; then
#启动程序
nohup java -jar $APP_DIR/$JAR_NAME > $APP_DIR/log.out 2>&1 &
echo "$JAR_NAME 启动完成 start success"
#输出进程编号
echo "ps number is:pid = ${pid} ,APP_DIR=${APP_DIR}"
else
#打印已启动程序的信息
echo "${JAR_NAME} is already running. pid=${pid} ."
fi
done
}
#停止方法,同样先调用is_exist方法看程序是否在运行,运行使用命令杀死进程,没有运行输出序没有在运行。
stop(){
local JAR_NAME=
for((i=0;i<${#JARS[@]};i++))
do
JAR_NAME=${JARS[$i]}
#检查程序是否在运行
#获取进程编号,并将进程编号赋值给pid变量
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在则启动jar包,存在则打印相关信息
if [ -z "${pid}" ]; then
#不存在 输出程序没有在运行
echo "${JAR_NAME} is not running"
else
#存在 使用命令杀掉此程序的进程,pid在is_exist已经获取
kill -9 $pid
fi
done
}
#输出运行状态
status(){
local JAR_NAME=
for((i=0;i<${#JARS[@]};i++))
do
JAR_NAME=${JARS[$i]}
#检查程序是否在运行
#获取进程编号,并将进程编号赋值给pid变量
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在则启动jar包,存在则打印相关信息
if [ -z "${pid}" ]; then
echo "${JAR_NAME} is NOT running."
else
echo "${JAR_NAME} is running. Pid is ${pid}"
fi
done
}
#重启
restart(){
stop
start
}
#输入方法:根据输入参数,选择执行对应方法,不输入则执行使用说明
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac