java项目构建发布全流程

101 阅读1分钟

背景

改文章为java项目传统发布流程,适用小白。尽管容器部署已经成为主流,传统部署方式因为依赖环境较少、灵活仍然具有一席之地。

构建发布quick start

新建项目

  • 新建web项目
  • 增加打包插件 maven-assembly-plugin
  • 增加打包 assembly.xml配置

gitee.com/zhangxiao00…

编写服务启停脚本

  • 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