| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- #!/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 "$@"
|