#!/bin/bash # ============================================================================= # RuoYi-Vue-Plus 热启动脚本 # 功能:启动应用并支持热加载、多环境切换等功能 # 位置:backend/hot-start.sh # 作者:zlwu # 时间:2025-07-01 # ============================================================================= # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' WHITE='\033[1;37m' NC='\033[0m' # No Color # 默认配置 DEFAULT_PROFILE="dev" DEFAULT_PORT="8080" DEFAULT_MODULE="ruoyi-admin" MAVEN_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC" # 脚本信息 SCRIPT_NAME="RuoYi热启动脚本" SCRIPT_VERSION="1.0.0" # 显示Logo show_logo() { echo -e "${CYAN}" echo "===================================================================================" echo " ____ __ ___ _ _ _ _ ____ _ _ " echo " | _ \ _ _ ___ | \/ (_) | | | | ___ | |_ / ___|| |_ __ _ _ __| |_ " echo " | |_) | | | |/ _ \ | |\/| | |_____| |_| |/ _ \| __| \___ \| __/ _\` | '__| __| " echo " | _ <| |_| | (_) || | | | |_____| _ | (_) | |_ ___) | || (_| | | | |_ " echo " |_| \_\\\\__,_|\___/ |_| |_|_| |_| |_|\___/ \__| |____/ \__\__,_|_| \__| " echo "" echo " 🚀 ${SCRIPT_NAME} v${SCRIPT_VERSION} 🚀" echo "===================================================================================" echo -e "${NC}" } # 显示帮助信息 show_help() { echo -e "${WHITE}用法: $0 [选项]${NC}" echo "" echo -e "${YELLOW}选项:${NC}" echo -e " ${GREEN}-h, --help${NC} 显示此帮助信息" echo -e " ${GREEN}-p, --profile${NC} 指定环境配置 (dev/test/prod,默认: dev)" echo -e " ${GREEN}-P, --port${NC} 指定端口号 (默认: 8080)" echo -e " ${GREEN}-m, --module${NC} 指定启动模块 (默认: ruoyi-admin)" echo -e " ${GREEN}-c, --clean${NC} 清理编译后启动" echo -e " ${GREEN}-d, --debug${NC} 启用调试模式" echo -e " ${GREEN}-j, --jvm-opts${NC} 自定义JVM参数" echo -e " ${GREEN}-t, --test${NC} 测试模式启动" echo -e " ${GREEN}--no-hot${NC} 禁用热加载功能" echo -e " ${GREEN}--check${NC} 检查环境配置" echo "" echo -e "${YELLOW}示例:${NC}" echo -e " $0 # 使用默认配置启动(开发环境+热加载)" echo -e " $0 -p prod # 生产环境启动" echo -e " $0 -P 9090 # 指定端口9090启动" echo -e " $0 -c # 清理编译后启动" echo -e " $0 -d # 调试模式启动" echo -e " $0 --no-hot # 禁用热加载启动" echo -e " $0 --check # 检查环境配置" echo "" echo -e "${CYAN}🔥 热加载功能说明:${NC}" echo -e " - 开发环境默认启用热加载,修改代码后自动重启" echo -e " - 支持Java代码、配置文件、MyBatis映射文件热加载" echo -e " - 详细配置见: docs/开发文档/热加载配置说明.md" } # 检查环境 check_environment() { echo -e "${BLUE}🔍 检查运行环境...${NC}" # 检查Java版本 if command -v java &> /dev/null; then JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2) echo -e " ✅ Java版本: ${GREEN}$JAVA_VERSION${NC}" else echo -e " ❌ ${RED}未找到Java环境${NC}" return 1 fi # 检查Maven版本 if command -v mvn &> /dev/null; then MVN_VERSION=$(mvn -version 2>/dev/null | head -n 1 | cut -d' ' -f3) echo -e " ✅ Maven版本: ${GREEN}$MVN_VERSION${NC}" else echo -e " ❌ ${RED}未找到Maven环境${NC}" return 1 fi # 检查目标模块 if [ -d "$DEFAULT_MODULE" ]; then echo -e " ✅ 目标模块: ${GREEN}$DEFAULT_MODULE${NC}" else echo -e " ❌ ${RED}未找到目标模块: $DEFAULT_MODULE${NC}" return 1 fi # 检查热加载配置 if grep -q "spring-boot-devtools" $DEFAULT_MODULE/pom.xml; then echo -e " ✅ 热加载配置: ${GREEN}已启用${NC}" else echo -e " ⚠️ 热加载配置: ${YELLOW}未配置${NC}" fi # 检查配置文件 CONFIG_FILE="$DEFAULT_MODULE/src/main/resources/application-$DEFAULT_PROFILE.yml" if [ -f "$CONFIG_FILE" ]; then echo -e " ✅ 配置文件: ${GREEN}$CONFIG_FILE${NC}" else echo -e " ❌ ${RED}未找到配置文件: $CONFIG_FILE${NC}" return 1 fi echo -e "${GREEN}✅ 环境检查完成${NC}" return 0 } # 检查端口占用 check_port() { local port=$1 if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then echo -e "${YELLOW}⚠️ 端口 $port 已被占用${NC}" echo -e "${CYAN}正在尝试找到占用进程...${NC}" lsof -Pi :$port -sTCP:LISTEN echo "" read -p "是否要杀死占用进程并继续启动? (y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo -e "${YELLOW}正在杀死端口 $port 的占用进程...${NC}" lsof -ti:$port | xargs kill -9 2>/dev/null sleep 2 echo -e "${GREEN}✅ 端口已释放${NC}" return 0 else echo -e "${RED}❌ 启动已取消${NC}" exit 1 fi fi return 0 } # 清理编译 clean_build() { echo -e "${BLUE}🧹 清理编译...${NC}" cd $DEFAULT_MODULE mvn clean > /dev/null 2>&1 if [ $? -eq 0 ]; then echo -e "${GREEN}✅ 清理完成${NC}" else echo -e "${RED}❌ 清理失败${NC}" exit 1 fi cd .. } # 构建项目 build_project() { echo -e "${BLUE}🔨 编译并打包项目...${NC}" cd $DEFAULT_MODULE mvn clean package -q if [ $? -eq 0 ]; then echo -e "${GREEN}✅ 编译打包完成${NC}" else echo -e "${RED}❌ 编译打包失败${NC}" exit 1 fi cd .. } # 新增:构建 ruoyi-modules build_ruoyi_modules() { echo -e "${BLUE}🔨 开始编译并打包 ruoyi-modules...${NC}" cd ruoyi-modules mvn clean install -q if [ $? -eq 0 ]; then echo -e "${GREEN}✅ ruoyi-modules 编译打包完成${NC}" else echo -e "${RED}❌ ruoyi-modules 编译打包失败${NC}" exit 1 fi cd .. } # 启动应用 start_application() { local profile=$1 local port=$2 local debug_mode=$3 local hot_reload=$4 local jvm_opts=$5 echo -e "${BLUE}🚀 启动应用...${NC}" echo -e "${CYAN}配置信息:${NC}" echo -e " 📂 模块: ${GREEN}$DEFAULT_MODULE${NC}" echo -e " 🌍 环境: ${GREEN}$profile${NC}" echo -e " 🔌 端口: ${GREEN}$port${NC}" echo -e " 🔥 热加载: ${GREEN}$([ "$hot_reload" = "true" ] && echo "启用" || echo "禁用")${NC}" echo -e " 🐛 调试模式: ${GREEN}$([ "$debug_mode" = "true" ] && echo "启用" || echo "禁用")${NC}" echo "" cd $DEFAULT_MODULE # 构建Maven命令 MVN_CMD="mvn spring-boot:run" # 添加环境配置 MVN_CMD="$MVN_CMD -Dspring-boot.run.profiles=$profile" # 添加端口配置 if [ "$port" != "$DEFAULT_PORT" ]; then MVN_CMD="$MVN_CMD -Dspring-boot.run.arguments=--server.port=$port" fi # 添加JVM参数 if [ -n "$jvm_opts" ]; then MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$jvm_opts\"" else MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS\"" fi # 调试模式 if [ "$debug_mode" = "true" ]; then MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005\"" echo -e "${PURPLE}🐛 调试端口: 5005${NC}" fi # 禁用热加载 if [ "$hot_reload" = "false" ]; then MVN_CMD="$MVN_CMD -Dspring.devtools.restart.enabled=false" fi echo -e "${CYAN}执行命令: ${WHITE}$MVN_CMD${NC}" echo -e "${GREEN}==================== 应用启动日志 ====================${NC}" echo "" # 执行命令 eval $MVN_CMD } # 主函数 main() { # 参数解析 PROFILE="$DEFAULT_PROFILE" PORT="$DEFAULT_PORT" MODULE="$DEFAULT_MODULE" CLEAN_BUILD=false DEBUG_MODE=false HOT_RELOAD=true JVM_OPTS="" CHECK_ONLY=false while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -p|--profile) PROFILE="$2" shift 2 ;; -P|--port) PORT="$2" shift 2 ;; -m|--module) MODULE="$2" DEFAULT_MODULE="$2" shift 2 ;; -c|--clean) CLEAN_BUILD=true shift ;; -d|--debug) DEBUG_MODE=true shift ;; -j|--jvm-opts) JVM_OPTS="$2" shift 2 ;; -t|--test) PROFILE="test" shift ;; --no-hot) HOT_RELOAD=false shift ;; --check) CHECK_ONLY=true shift ;; *) echo -e "${RED}未知参数: $1${NC}" show_help exit 1 ;; esac done # 显示Logo show_logo # 仅检查环境 if [ "$CHECK_ONLY" = "true" ]; then check_environment exit $? fi # 环境检查 if ! check_environment; then echo -e "${RED}❌ 环境检查失败,请检查配置${NC}" exit 1 fi echo "" # 端口检查 check_port $PORT # 清理编译 if [ "$CLEAN_BUILD" = "true" ]; then clean_build echo "" fi # 先编译打包 ruoyi-modules build_ruoyi_modules echo "" # 再编译打包 ruoyi-admin build_project echo "" # 启动应用 start_application "$PROFILE" "$PORT" "$DEBUG_MODE" "$HOT_RELOAD" "$JVM_OPTS" } # 错误处理 trap 'echo -e "\n${YELLOW}⚠️ 应用启动已中断${NC}"; exit 1' INT TERM # 执行主函数 main "$@"