搭建项目
- src
- bin
- run.sh
- main
- pom.xml
- bin
配置pom文件
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!--拷贝依赖 copy-dependencies-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/deploy/lib/
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 拷贝资源文件 copy-resources-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/bin</directory>
</resource>
</resources>
<outputDirectory>${project.build.directory}/deploy/bin</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-classes</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${project.build.directory}/classes</directory>
</resource>
</resources>
<outputDirectory>${project.build.directory}/deploy/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置启动脚本run.sh
- 创建脚本run.sh,内容如下
- 修改MAIN_CLASS为启动类名称
常用执行命令
./run.sh start 启动
./run.sh stop 停止
./run.sh restart 重启
./run.sh status 查看启动状态
#!/bin/bash
# 根目录
PACKAGE_HOME=$(cd "$(dirname "$0")";cd ..;pwd)
# Java程序主体所在的目录,即classes的上一级目录
MAIN_CLASS=cn.teleinfo.bussiness.embed.NbmsWebApp
# PID文件位置
PID_LOCATION=$PACKAGE_HOME/bin/.pid
PID_LOCAL=0
# 日志的默认输出目录
LOG_DIR=$PACKAGE_HOME/logs
LOG_BASE_NAME=debug.log
# JVM启动参数
# -server:一定要作为第一个参数,多个CPU时性能佳
# -Xloggc:记录GC日志,建议写成绝对路径,如此便可在任意目录下执行该shell脚本
JAVA_OPTS=${JVM_OPTS:-"-server -Xms1024m -Xmx2048m -Xloggc:$LOG_DIR/gc.log"}
# classpath
CLASSPATH="${PACKAGE_HOME}/classes:${PACKAGE_HOME}/lib/*"
# 初始化全局变量,用于标识交易前置系统的PID(0表示未启动)
tradePortalPID=()
# 获取Java应用的PID
# ------------------------------------------------------------------------------------------------------
# 说明:通过JDK自带的jps命令,联合Linux中的grep命令,可以准确查找到Java应用的PID
# [jps -l]表示显示Java主程序的完整包路径
# awk命令可以分割出PID($1部分)及Java主程序名称($2部分)
# 例子:[$JAVA_HOME/bin/jps -l | grep $MAIN_CLASS]命令执行,会看到[5775 com.cucpay.tradeportal.MainApp]
# 另外:这个命令也可以取到程序的PID-->[ps aux|grep java|grep $MAIN_CLASS|grep -v grep|awk '{print $2}']
# ------------------------------------------------------------------------------------------------------
function getTradeProtalPID(){
tradePortalPID=(`ps x | grep $MAIN_CLASS | grep -v grep | awk '{print $1}'`)
}
# 启动Java应用程序
# ------------------------------------------------------------------------------------------------------
# 1、调用getTradeProtalPID()函数,刷新$tradePortalPID全局变量
# 2、若程序已经启动($tradePortalPID不等于0),则提示程序已启动
# 3、若程序未被启动,则执行启动命令
# 4、启动命令执行后,再次调用getTradeProtalPID()函数
# 5、若步骤4执行后,程序的PID不等于0,则打印Success,反之打印Failed
# 注意:[echo -n]表示打印字符后不换行
# 注意:[nohup command > /path/nohup.log &]是将作业输出到nohup.log,否则它会输出到该脚本目录下的nohup.out中
# ------------------------------------------------------------------------------------------------------
function startup(){
getTradeProtalPID
if [ ! -d $LOG_DIR ]; then
mkdir -p $LOG_DIR
fi
echo "==============================================================================================="
if [ ${#tradePortalPID[@]} -ne 0 ]; then
read -t 5 -p "$MAIN_CLASS already started(PID=${tradePortalPID[*]}), do want need create a new server? [y/n]" flag
case $flag in
[yY]*)
rm -f $PID_LOCATION
echo -n "Starting $MAIN_CLASS"
nohup java $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS >/dev/null 2>&1 & echo $! > $PID_LOCATION
PID_LOCAL=`head -n +1 $PID_LOCATION`
echo "(PID=$PID_LOCAL)...[Success]"
echo "==============================================================================================="
sleep 1
tail -f $LOG_DIR/$LOG_BASE_NAME
;;
[nN]*)
echo "[Canceld]"
echo "==============================================================================================="
;;
*)
echo "please enter : y or n"
echo "==============================================================================================="
;;
esac
else
nohup java $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS >/dev/null 2>&1 & echo $! > $PID_LOCATION
PID_LOCAL=`head -n +1 $PID_LOCATION`
echo "(PID=$PID_LOCAL)...[Success]"
echo "==============================================================================================="
sleep 1
tail -f $LOG_DIR/$LOG_BASE_NAME
fi
}
function shutdown(){
getTradeProtalPID
echo "==============================================================================================="
if [ -f "$PID_LOCATION" ];then
PID_LOCAL=`head -n +1 $PID_LOCATION`
fi
if [ $PID_LOCAL -ne 0 ]; then
echo -n "Stopping $MAIN_CLASS(PID=$PID_LOCAL) waiting 5s ..."
kill $PID_LOCAL
sleep 5
getTradeProtalPID
if echo "${tradePortalPID[@]}" | grep -w "$PID_LOCAL" &>/dev/null; then
echo "[Failed]"
echo "==============================================================================================="
shutdown
fi
rm -f $PID_LOCATION
echo "[Success]"
echo "==============================================================================================="
else
if [ ${#tradePortalPID[@]} -ne 0 ]; then
read -t 5 -p "$MAIN_CLASS already started(PID=${tradePortalPID[*]}), do want stop all server? [y/n]" flag
case $flag in
[yY]*)
for item in ${tradePortalPID[*]}
do
echo "[Kill PID=$item waiting 5s ...]"
kill $item
sleep 5
done
echo "==============================================================================================="
shutdown
;;
[nN]*)
echo "[Canceld]"
echo "==============================================================================================="
;;
*)
echo "please enter : y or n"
echo "==============================================================================================="
;;
esac
else
rm -f $PID_LOCATION
echo "[Success]"
echo "==============================================================================================="
fi
fi
}
function docker(){
if [ ! -d $LOG_DIR ]; then
mkdir $LOG_DIR
fi
nohup java $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS >/dev/null 2>&1 & echo $! > $PID_LOCATION
}
function status(){
if [ -f "$PID_LOCATION" ];then
PID_LOCAL=`head -n +1 $PID_LOCATION`
fi
echo "==============================================================================================="
if [ $PID_LOCAL -ne 0 ]; then
echo "$MAIN_CLASS already started(PID=$PID_LOCAL)"
echo "==============================================================================================="
tail -f $LOG_DIR/$LOG_BASE_NAME
else
echo "$MAIN_CLASS is not running"
echo "==============================================================================================="
fi
}
case "$1" in
start)
startup
;;
stop)
shutdown
;;
status)
status
;;
docker)
docker
;;
restart)
shutdown
startup
;;
*)
echo "please use : ./run.sh {start|stop|restart|status}"
;;
esac
exit 0
打包部署
-
执行打包命令
mvn clean package -Dmaven.test.skip=true
-
打包后将deploy文件夹部署即可
来源:CSDN
作者:TBC_博客
链接:https://blog.csdn.net/sinat_31908303/article/details/86249447