背景
改文章为java项目传统发布流程,适用小白。尽管容器部署已经成为主流,传统部署方式因为依赖环境较少、灵活仍然具有一席之地。
构建发布quick start
新建项目
- 新建web项目
- 增加打包插件 maven-assembly-plugin
- 增加打包 assembly.xml配置
编写服务启停脚本
- common.sh
#!/bin/bash
#主类
MAIN_CLASS=com.zxiao.helloweb.HelloWebApplication
JAVA_HOME=/home/dc_worker/jdk1.8.0_341
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
if [ -z "$JAVA_HOME" ]; then
JAVA="java"
else
JAVA="$JAVA_HOME/bin/java"
fi
function usage() {
echo "usage:"
echo "-h --help"
echo "-e --env=dev, local, or prod"
echo ""
}
while [ "$1" != "" ]; do
PARAM=`echo $1 | awk -F= '{print $1}'`
VALUE=`echo $1 | awk -F= '{print $2}'`
case ${PARAM} in
-h | --help)
usage
exit
;;
-e | --env)
ENVIRONMENT=${VALUE}
;;
*)
BYPASS_PARAMS="$BYPASS_PARAMS $PARAM"
;;
esac
shift
done
-start_server.sh
#!/bin/bash
# /data/project/hello-web/bin/start_server.sh
HERE=$(cd $(dirname "$0"); pwd)
BASE=$(dirname "$HERE")
PROJECT_NAME=$(basename "$BASE")
LOG_BASE_DIR=$(dirname $(dirname "$BASE"))
LOG_BASE="$LOG_BASE_DIR/logs/$PROJECT_NAME"
source "$HERE/common.sh"
nowday=`date +%Y%m%d`
GC_LOG_DIR=${LOG_BASE}/gclogs
test -d ${GC_LOG_DIR} || mkdir -p ${GC_LOG_DIR}
cd ${BASE}
CLASS_PATH=${BASE}/lib/*:${CLASS_PATH}
CLASS_PATH=${BASE}/resources/:${BASE}/conf/${ENVIRONMENT}:${CLASS_PATH}
if [ "${ENVIRONMENT}" = "prod" ]; then
HEAP_OPTS="-Xmx2g -Xms2g -Xmn1g -Xss256k"
else
HEAP_OPTS="-Xmx256m -Xms256m"
# DEBUG_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8187"
fi
PERM_OPTS="-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:AutoBoxCacheMax=10000 -XX:+ParallelRefProcEnabled -Djava.security.egd=file:/dev/./urandom -Djava.net.preferIPv4Stack=true"
GC_OPTS="-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=6 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSWaitDuration=10000 -XX:+ExplicitGCInvokesConcurrent -Xloggc:${GC_LOG_DIR}/gc.log.${nowday} -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails"
MISC_OPTS="-Dlog.home=${LOG_BASE}"
ERROR_OPTS="-XX:ErrorFile=${LOG_BASE}/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_BASE}/"
JAVA_OPTS="${JAVA_OPTS} ${HEAP_OPTS} ${PERM_OPTS} ${GC_OPTS} ${MISC_OPTS} ${ERROR_OPTS} ${DEBUG_OPTS}"
nohup ${JAVA} ${JAVA_OPTS} -classpath ${CLASS_PATH} ${MAIN_CLASS} > ${LOG_BASE}/console.log 2>&1 &
echo $! > ${LOG_BASE}/app.pid
-stop_server.sh
#!/bin/bash
HERE=$(dirname "$0")
BASE=$(dirname "$HERE")
source "$HERE/common.sh"
PID=$(jps -l | grep "${MAIN_CLASS}"| awk '{print $1}')
if [[ -n ${PID} ]]; then
echo kill ${PID}
kill ${PID}
sleep 10s
fi
- force_stop_server.sh
#!/bin/bash
HERE=$(dirname "$0")
BASE=$(dirname "$HERE")
source "$HERE/common.sh"
PID=$(jps -l | grep "${MAIN_CLASS}"| awk '{print $1}')
if [ -n ${PID} ]; then
echo kill -9 ${PID}
kill -9 ${PID}
fi
打包
clean package -Dmaven.test.skip=true
hello-web-0.0.1-SNAPSHOT-package.zip
启动服务
打包后上传到/data/project
cd /data/project
upzip hello-web-0.0.1-SNAPSHOT-package.zip -d ./hello-web
./start_server.sh -e=test