8、Spring Boot 2.x 服务器部署
1.8 服务器部署
- 完整源码: Spring-Boot-Demos
1.8.1 jar包提取出来maven打包(避免每次重复打相同的jar包),pom.xml配置如下:
<build>
<finalName>xxx</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
<attach>false</attach>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<includeScope>runtime</includeScope>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.8.2 常用命令
- 打包:
mvn clean package -DskipTests
- 运行:
nohup java -jar xxx.jar >./logs/xxx.log 2>&1 &
- 查询:
jps -l | grep xxx.jar
- 关闭:
kill -9 pid
1.8.3 启动脚本startup.sh
# !/bin/bash
JAVA_HOME="/opt/jvm/jdk1.8.0_141"
APP_HOME="/data/Project/backend"
APP_LOG="$APP_HOME/logs"
APP_LIBS="$APP_HOME/libs"
APP_MAIN="xxx.jar"
# JVM启动参数
# -server:一定要作为第一个参数,多个CPU时性能佳
# -Xloggc:记录GC日志,建议写成绝对路径,如此便可在任意目录下执行该shell脚本
#JAVA_OPTS="-server -Xms1048m -Xmx1048m -Xloggc:$APP_HOME/logs/gc.log"
JAVA_OPTS="-server -Xms1048m -Xmx1048m"
# 加载依赖到classpath
#for lib in ${APP_HOME}/libs/*.jar;
# do CLASSPATH=${lib}:"${CLASSPATH}";
#done
#for setting in ${APP_HOME}/config/*.setting;
# do CLASSPATH=config/${setting##*/}:"${CLASSPATH}";
#done
#CLASSPATH=log4j.properties:"${CLASSPATH}"
#CLASSPATH=${CLASSPATH}:.:${APP_HOME}/dailyload.jar
# 初始化参数
#if [ -n "$1" ] ;
#then
# dt=$1
# if ! (echo $dt | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $dt +%Y%m%d >/dev/null 2>&1;)
# then
# echo "param can not convert to date : $dt"
# exit 1
# fi
#else
# dt=`date -d "0 days ago" "+%Y-%m-%d"`
#fi
args="$*"
# 初始化进程ID(0表示未启动)
pid=0
# 获取Java应用的PID
getPID(){
javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAIN`
if [ -n "$javaps" ]; then
pid=`echo $javaps | awk '{print $1}'`
else
pid=0
fi
}
# 启动Java应用程序
# ------------------------------------------------------------------------------------------------------
# 1、调用getPID()函数,刷新$pid全局变量
# 2、若程序已经启动($pid不等于0),则提示程序已启动
# 3、若程序未被启动,则执行启动命令
# 4、启动命令执行后,再次调用getPID()函数
# 5、若步骤4执行后,程序的PID不等于0,则打印Success,反之打印Failed
# 注意:[echo -n]表示打印字符后不换行
# 注意:[nohup command > /path/nohup.log &]是将作业输出到nohup.log,否则它会输出到该脚本目录下的nohup.out中
# ------------------------------------------------------------------------------------------------------
startup(){
getPID
echo "==============================================================================================="
if [ $pid -ne 0 ]; then
echo "$APP_MAIN already started(PID=$pid)"
echo "==============================================================================================="
else
echo -n "Starting $APP_MAIN"
#方式1 可执行jar包(jar的MANIFEST.MF文件已指定主函数和依赖)
#nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar dailyload.jar $dt > $APP_LOG/nohup.log &
nohup java -Dloader.path=$APP_LIBS -jar $APP_HOME/xxx.jar > /dev/null &
#方式2 不可执行jar包(需自己加载依赖到classpath)
#nohup $JAVA_HOME/bin/java $JAVA_OPTS -Dfile.encoding=UTF-8 -classpath $CLASSPATH $APP_MAIN $args > $APP_LOG/nohup.log &
#nohup $JAVA_HOME/bin/java $JAVA_OPTS -Dfile.encoding=UTF-8 -classpath $CLASSPATH $APP_MAIN $args > /dev/null &
getPID
if [ $pid -ne 0 ]; then
echo "(PID=$pid)...[Success]"
echo "==============================================================================================="
else
echo "[Failed]"
echo "==============================================================================================="
fi
fi
}
# 启动
startup
1.8.4 查询状态脚本 status.sh
# !/bin/bash
APP_HOME=/data/Project/backend
APP_MAIN=xxx.jar
pid=0
getPID(){
javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAIN`
if [ -n "$javaps" ]; then
pid=`echo $javaps | awk '{print $1}'`
else
pid=0
fi
}
getServerStatus(){
getPID
echo "==============================================================================================="
if [ $pid -ne 0 ]; then
echo "$APP_MAIN is running(PID=$pid)"
echo "==============================================================================================="
else
echo "$APP_MAIN is not running"
echo "==============================================================================================="
fi
}
getServerStatus
1.8.5 关闭脚本 shutdown.sh
# !/bin/bash
APP_HOME=/data/Project/backend/
APP_MAIN=xxx.jar
pid=0
getPID(){
javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAIN`
if [ -n "$javaps" ]; then
pid=`echo $javaps | awk '{print $1}'`
else
pid=0
fi
}
# 停止Java应用程序
# ------------------------------------------------------------------------------------------------------
# 1、调用getPID()函数,刷新$pid全局变量
# 2、若程序已经启动($pid不等于0),则开始执行停止程序操作,否则提示程序未运行
# 3、使用[kill -9 PID]命令强制杀掉进程
# 4、使用[$?]获取上一句命令的返回值,若其为0,表示程序已停止运行,则打印Success,反之打印Failed
# 5、为防止Java程序被启动多次,这里增加了反复检查程序进程的功能,通过递归调用shutdown()函数的方式,反复kill
# 注意:Shell编程中,[$?]表示上一句命令或者上一个函数的返回值
# ------------------------------------------------------------------------------------------------------
shutdown(){
getPID
echo "==============================================================================================="
if [ $pid -ne 0 ]; then
echo -n "Stopping $APP_MAIN(PID=$pid)..."
kill -9 $pid
if [ $? -eq 0 ]; then
echo "[Success]"
echo "==============================================================================================="
else
echo "[Failed]"
echo "==============================================================================================="
fi
getPID
if [ $pid -ne 0 ]; then
shutdown
fi
else
echo "$APP_MAIN is not running"
echo "==============================================================================================="
fi
}
shutdown
8、Spring Boot 2.x 服务器部署的更多相关文章
- spring boot本地调试服务器部署项目
项目本地测试然后发布到服务器上,各种BUG层出不穷.那么下面配置下,然后在本地调试部署在服务器上的程序吧 一.首先idea打开你的项目,服务器上传打包的程序.然后如下命令启动(linux),绿色参数为 ...
- Spring Boot(十二):spring boot如何测试打包部署
Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...
- Spring Boot应用 打包与部署指南
Spring Boot的打包与部署有何特点? Java Web应用在Spring Boot之前,通常是打包成war(Web application ARchive)包,结合Tomcat来完成部署. 对 ...
- Spring Boot入门系列(十五)Spring Boot 开发环境热部署
在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...
- 【docker】docker部署spring boot项目在服务器上
IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...
- docker部署spring boot项目在服务器上
IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...
- Spring Boot 系列教程5-热部署-devtools模块
devtools模块 devtools模块,是为开发者服务的一个模块.主要的功能就是代码修改后一般在5秒之内就会自动重新加载至服务器,相当于restart成功. 原理 简单原理 在发现代码有更改之后, ...
- 如何把kotlin+spring boot开发的项目部署在tomcat上
本文只讲部署过程,你首先要保证你的程序能在IDE里跑起来: 先看看你的application.properties中设置的端口号与你服务器上tomcat的端口号是否一致 server.port=80 ...
- Spring boot(4)-应用打包部署
1.Spring Boot内置web spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定 ...
随机推荐
- python学习-28 map函数
1. num_1 = [10,2,3,4] def map_test(array): ret = [] for i in num_1: ret.append(i**2) # 列表里每个元素都平方 re ...
- 利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)
4.2 通用函数:快速的元素级数组函数 通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数. 1)一元(unary)ufunc,如,sqrt和exp函数 2)二元(unary) ...
- 1201: 位运算之拼整数(Java)
WUSTOJ 1201: 位运算之拼整数 题目 原题链接 参考博客 XXXXXyun的博客--输入十六进制数 Description 输入无符号短整数k[hex.]和p[oct.],将k的高字节作为结 ...
- S03_CH07_AXI_VDMA_OV5640摄像头采集系统
S03_CH07_AXI_VDMA_OV5640摄像头采集系统 7.1概述 本章内容和<S03_CH06_AXI_VDMA_OV7725摄像头采集系统>只是摄像头采用的分辨率不同,其他原理 ...
- nginx 设置开机启动
设置nginx开机启动chkconfig --add /etc/init.d/nginx chkconfig nginx on
- 【判环】Perpetuum Mobile
Perpetuum Mobile 题目描述 The year is 1902. Albert Einstein is working in the patent office in Bern. Many ...
- Django——关于项目开发遇到的一些小技巧
目录 头像图片 js获取网站信息 js获取前端信息 Dj获取刚写入的数据的信息 js跳转新链接 头像图片对象的显示 在做到根据登陆ID决定用户头像的时候,加载静态文件的{% static ‘xxxxx ...
- 导入别的项目到我的eclipse上出现红色感叹号问题
项目红色感叹号问题问题 一般我们在导入别的项目到我的eclipse上面会发现,项目上面有红色的错误 原因 因为我电脑上的 jdk版本和别人电脑jdk版本不一样,那么对于的jre版本也不 ...
- JS OOP -04 JS中的公有成员,私有成员和静态成员
JS中的公有成员,私有成员和静态成员 a.实现类的公有成员 b.实现类的私有成员 c.实现类的静态成员 a.实现类的公有成员 之前定义的任何类型成员都属于公有成员的范畴,该类的任何实例都对外公开这些属 ...
- [NOIP2018模拟赛10.20A]挂分报告
闲扯 先看看了B组,T1 ZROI刚好讲过一个性质原根一般很小的,直接枚举;T2一眼二分然后似乎状压 T3没看 然后上来A组题,T1 flow这名字...网络流?! T1题面非常的社会主义核心价值观, ...