zhangjf a4aa4b4156 feat: 优化打包方式为普通JAR+依赖分离
- 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目录
- 资源文件外置便于修改
2026-02-22 20:22:27 +08:00

128 lines
3.8 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_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. 构建ClassPathlib目录所有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))"