zhangjf 2184dce6a8 refactor: 优化打包结构,主JAR放入lib目录并带版本号
- pom.xml: 移除finalName配置,JAR保留版本号
- assembly.xml: 主JAR放入lib目录(useProjectArtifact=true)
- start.sh: 简化启动逻辑
  - ClassPath统一为 lib/*
  - 无需单独匹配主JAR文件名
  - 只需配置MAIN_CLASS即可启动

优势:
- 主JAR带版本号便于版本识别和升级
- 所有JAR统一放lib目录,结构清晰
- 启动脚本更简洁,无需APP_NAME匹配JAR
2026-02-22 20:30:28 +08:00

109 lines
3.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 服务启动脚本
# 支持多租户模式:同一服务可部署多个实例(数据库连接不同)
# 获取脚本所在目录
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
APP_HOME=$(dirname "$SCRIPT_DIR")
# 加载函数读取properties文件
load_properties() {
local file="$1"
if [ -f "$file" ]; then
while IFS='=' read -r key value; do
[[ "$key" =~ ^#.*$ ]] && continue
[[ -z "$key" ]] && continue
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# 跳过空值
[[ -z "$value" ]] && continue
export "$key=$value"
done < "$file"
fi
}
# 1. 加载统一环境配置
load_properties "${APP_HOME}/conf/env.properties"
# 2. 加载服务个性化配置(覆盖统一配置)
load_properties "${APP_HOME}/conf/service.properties"
# 3. 设置默认值
APP_NAME=${APP_NAME:-"unknown"}
# INSTANCE_NAME: 如果为空或为字面值${APP_NAME}则使用APP_NAME
if [[ -z "${INSTANCE_NAME}" ]] || [[ "${INSTANCE_NAME}" == '\${APP_NAME}' ]]; then
INSTANCE_NAME=${APP_NAME}
fi
TENANT_ID=${TENANT_ID:-""}
# 4. 主类从service.properties读取必须配置
MAIN_CLASS=${MAIN_CLASS:-""}
if [ -z "$MAIN_CLASS" ]; then
echo "Error: MAIN_CLASS not configured in service.properties"
exit 1
fi
# 5. ClassPathlib目录所有jar包括主JAR和依赖
if [ ! -d "${APP_HOME}/lib" ]; then
echo "Error: lib directory not found: ${APP_HOME}/lib"
exit 1
fi
CLASSPATH="${APP_HOME}/lib/*"
# 6. 日志目录使用INSTANCE_NAME区分不同实例
LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}"
# 7. PID文件路径
PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid"
# JVM参数可通过环境变量覆盖
JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200}"
# 日志参数从env.properties读取或使用默认值
LOG_OPTS="-Dlogging.file.path=${LOG_HOME}"
LOG_OPTS="$LOG_OPTS -Dspring.application.name=${APP_NAME}"
LOG_OPTS="$LOG_OPTS -Dlogging.level.root=${LOG_LEVEL_ROOT:-INFO}"
LOG_OPTS="$LOG_OPTS -Dlogging.level.app=${LOG_LEVEL_APP:-DEBUG}"
LOG_OPTS="$LOG_OPTS -Dlogging.pattern.console=${LOG_PATTERN}"
# 多租户参数
TENANT_OPTS=""
if [ -n "${TENANT_ID}" ]; then
TENANT_OPTS="-DTENANT_ID=${TENANT_ID}"
fi
# 配置文件路径
CONFIG_OPTS="--spring.config.location=${APP_HOME}/conf/application.yml"
# 检查是否已运行
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null 2>&1; then
echo "${INSTANCE_NAME} is already running (PID: $PID)"
exit 1
fi
fi
# 创建日志目录
mkdir -p ${LOG_HOME}
# 启动服务
echo "Starting ${INSTANCE_NAME}..."
echo " APP_NAME: ${APP_NAME}"
echo " INSTANCE_NAME: ${INSTANCE_NAME}"
echo " APP_HOME: ${APP_HOME}"
echo " MAIN_CLASS: ${MAIN_CLASS}"
echo " CLASSPATH: ${CLASSPATH}"
echo " LOG_HOME: ${LOG_HOME}"
echo " JAVA_OPTS: ${JAVA_OPTS}"
if [ -n "${TENANT_ID}" ]; then
echo " TENANT_ID: ${TENANT_ID}"
fi
# 启动命令java -cp lib/* MainClass
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -cp "$CLASSPATH" $MAIN_CLASS $CONFIG_OPTS > /dev/null 2>&1 &
# 保存PID
echo $! > $PID_FILE
echo "${INSTANCE_NAME} started (PID: $(cat $PID_FILE))"