- pom.xml: - 添加finalName配置去除版本号 - maven-jar-plugin排除资源文件 - 禁用spring-boot-maven-plugin repackage - 各服务移除冗余的plugin配置 - assembly.xml: - 主JAR放根目录(仅服务代码) - lib目录放依赖JAR - start.sh: - 支持java -cp classpath模式启动 - 从service.properties读取MAIN_CLASS - 向后兼容fat jar模式 - service.properties: - 所有服务添加MAIN_CLASS配置 优势: - 主JAR从131MB缩小到103KB - 多服务部署可共享lib目录 - 资源文件外置便于修改
128 lines
3.8 KiB
Bash
Executable File
128 lines
3.8 KiB
Bash
Executable File
#!/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. 主JAR文件路径
|
||
JAR_FILE="${APP_HOME}/${APP_NAME}.jar"
|
||
if [ ! -f "$JAR_FILE" ]; then
|
||
echo "Error: No JAR file found: ${JAR_FILE}"
|
||
exit 1
|
||
fi
|
||
|
||
# 5. 主类(从service.properties读取,或使用默认值)
|
||
MAIN_CLASS=${MAIN_CLASS:-""}
|
||
if [ -z "$MAIN_CLASS" ]; then
|
||
echo "Error: MAIN_CLASS not configured in service.properties"
|
||
exit 1
|
||
fi
|
||
|
||
# 6. 构建ClassPath(lib目录所有jar + 主jar)
|
||
# 检查lib目录是否存在
|
||
if [ -d "${APP_HOME}/lib" ]; then
|
||
# 构建classpath: lib/* + 主JAR
|
||
CLASSPATH="${APP_HOME}/lib/*:${JAR_FILE}"
|
||
LAUNCH_MODE="classpath"
|
||
else
|
||
# fallback: fat jar模式(向后兼容)
|
||
CLASSPATH="${JAR_FILE}"
|
||
LAUNCH_MODE="fatjar"
|
||
fi
|
||
|
||
# 7. 日志目录(使用INSTANCE_NAME区分不同实例)
|
||
LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}"
|
||
|
||
# 8. 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 " JAR_FILE: ${JAR_FILE}"
|
||
echo " MAIN_CLASS: ${MAIN_CLASS}"
|
||
echo " LAUNCH_MODE: ${LAUNCH_MODE}"
|
||
echo " LOG_HOME: ${LOG_HOME}"
|
||
echo " JAVA_OPTS: ${JAVA_OPTS}"
|
||
if [ -n "${TENANT_ID}" ]; then
|
||
echo " TENANT_ID: ${TENANT_ID}"
|
||
fi
|
||
|
||
# 根据启动模式选择启动方式
|
||
if [ "$LAUNCH_MODE" == "classpath" ]; then
|
||
# ClassPath模式:java -cp lib/*:app.jar MainClass
|
||
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -cp "$CLASSPATH" $MAIN_CLASS $CONFIG_OPTS > /dev/null 2>&1 &
|
||
else
|
||
# FatJar模式:java -jar app.jar(向后兼容)
|
||
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 &
|
||
fi
|
||
|
||
# 保存PID
|
||
echo $! > $PID_FILE
|
||
echo "${INSTANCE_NAME} started (PID: $(cat $PID_FILE))"
|