zhangjf b8044c3769 fix: 修复Assembly打包与启动脚本JAR查找问题
- assembly.xml: 主JAR放到根目录,移除lib目录
  - Spring Boot fat jar已包含所有依赖
  - 避免依赖JAR冗余和混淆

- start.sh: 优化JAR文件查找逻辑
  - 优先查找根目录: ${APP_HOME}/${APP_NAME}.jar
  - fallback到lib目录(向后兼容)
  - 添加JAR_FILE到启动日志输出
2026-02-22 20:03:29 +08:00

112 lines
3.5 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. JAR文件路径优先查找根目录的主JAR再查找lib目录
# Spring Boot fat jar已包含所有依赖主JAR在根目录
JAR_FILE="${APP_HOME}/${APP_NAME}.jar"
if [ ! -f "$JAR_FILE" ]; then
# fallback: 查找lib目录兼容旧版打包结构
JAR_FILE=$(ls ${APP_HOME}/lib/${APP_NAME}*.jar 2>/dev/null | head -1)
fi
if [ ! -f "$JAR_FILE" ]; then
# 最后尝试: lib目录任意jar向后兼容
JAR_FILE=$(ls ${APP_HOME}/lib/*.jar 2>/dev/null | head -1)
fi
if [ -z "$JAR_FILE" ] || [ ! -f "$JAR_FILE" ]; then
echo "Error: No JAR file found for ${APP_NAME}"
echo " Searched: ${APP_HOME}/${APP_NAME}.jar"
echo " Searched: ${APP_HOME}/lib/${APP_NAME}*.jar"
echo " Searched: ${APP_HOME}/lib/*.jar"
exit 1
fi
# 5. 日志目录使用INSTANCE_NAME区分不同实例
LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}"
# 6. 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 " LOG_HOME: ${LOG_HOME}"
echo " JAVA_OPTS: ${JAVA_OPTS}"
if [ -n "${TENANT_ID}" ]; then
echo " TENANT_ID: ${TENANT_ID}"
fi
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 &
# 保存PID
echo $! > $PID_FILE
echo "${INSTANCE_NAME} started (PID: $(cat $PID_FILE))"