hot-start.sh 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. #!/bin/bash
  2. # =============================================================================
  3. # RuoYi-Vue-Plus 热启动脚本
  4. # 功能:启动应用并支持热加载、多环境切换等功能
  5. # 位置:backend/hot-start.sh
  6. # 作者:zlwu
  7. # 时间:2025-07-01
  8. # =============================================================================
  9. # 颜色定义
  10. RED='\033[0;31m'
  11. GREEN='\033[0;32m'
  12. YELLOW='\033[1;33m'
  13. BLUE='\033[0;34m'
  14. PURPLE='\033[0;35m'
  15. CYAN='\033[0;36m'
  16. WHITE='\033[1;37m'
  17. NC='\033[0m' # No Color
  18. # 默认配置
  19. DEFAULT_PROFILE="dev"
  20. DEFAULT_PORT="8080"
  21. DEFAULT_MODULE="ruoyi-admin"
  22. MAVEN_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC"
  23. # 脚本信息
  24. SCRIPT_NAME="RuoYi热启动脚本"
  25. SCRIPT_VERSION="1.0.0"
  26. # 显示Logo
  27. show_logo() {
  28. echo -e "${CYAN}"
  29. echo "==================================================================================="
  30. echo " ____ __ ___ _ _ _ _ ____ _ _ "
  31. echo " | _ \ _ _ ___ | \/ (_) | | | | ___ | |_ / ___|| |_ __ _ _ __| |_ "
  32. echo " | |_) | | | |/ _ \ | |\/| | |_____| |_| |/ _ \| __| \___ \| __/ _\` | '__| __| "
  33. echo " | _ <| |_| | (_) || | | | |_____| _ | (_) | |_ ___) | || (_| | | | |_ "
  34. echo " |_| \_\\\\__,_|\___/ |_| |_|_| |_| |_|\___/ \__| |____/ \__\__,_|_| \__| "
  35. echo ""
  36. echo " 🚀 ${SCRIPT_NAME} v${SCRIPT_VERSION} 🚀"
  37. echo "==================================================================================="
  38. echo -e "${NC}"
  39. }
  40. # 显示帮助信息
  41. show_help() {
  42. echo -e "${WHITE}用法: $0 [选项]${NC}"
  43. echo ""
  44. echo -e "${YELLOW}选项:${NC}"
  45. echo -e " ${GREEN}-h, --help${NC} 显示此帮助信息"
  46. echo -e " ${GREEN}-p, --profile${NC} 指定环境配置 (dev/test/prod,默认: dev)"
  47. echo -e " ${GREEN}-P, --port${NC} 指定端口号 (默认: 8080)"
  48. echo -e " ${GREEN}-m, --module${NC} 指定启动模块 (默认: ruoyi-admin)"
  49. echo -e " ${GREEN}-c, --clean${NC} 清理编译后启动"
  50. echo -e " ${GREEN}-d, --debug${NC} 启用调试模式"
  51. echo -e " ${GREEN}-j, --jvm-opts${NC} 自定义JVM参数"
  52. echo -e " ${GREEN}-t, --test${NC} 测试模式启动"
  53. echo -e " ${GREEN}--no-hot${NC} 禁用热加载功能"
  54. echo -e " ${GREEN}--check${NC} 检查环境配置"
  55. echo ""
  56. echo -e "${YELLOW}示例:${NC}"
  57. echo -e " $0 # 使用默认配置启动(开发环境+热加载)"
  58. echo -e " $0 -p prod # 生产环境启动"
  59. echo -e " $0 -P 9090 # 指定端口9090启动"
  60. echo -e " $0 -c # 清理编译后启动"
  61. echo -e " $0 -d # 调试模式启动"
  62. echo -e " $0 --no-hot # 禁用热加载启动"
  63. echo -e " $0 --check # 检查环境配置"
  64. echo ""
  65. echo -e "${CYAN}🔥 热加载功能说明:${NC}"
  66. echo -e " - 开发环境默认启用热加载,修改代码后自动重启"
  67. echo -e " - 支持Java代码、配置文件、MyBatis映射文件热加载"
  68. echo -e " - 详细配置见: docs/开发文档/热加载配置说明.md"
  69. }
  70. # 检查环境
  71. check_environment() {
  72. echo -e "${BLUE}🔍 检查运行环境...${NC}"
  73. # 检查Java版本
  74. if command -v java &> /dev/null; then
  75. JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
  76. echo -e " ✅ Java版本: ${GREEN}$JAVA_VERSION${NC}"
  77. else
  78. echo -e " ❌ ${RED}未找到Java环境${NC}"
  79. return 1
  80. fi
  81. # 检查Maven版本
  82. if command -v mvn &> /dev/null; then
  83. MVN_VERSION=$(mvn -version 2>/dev/null | head -n 1 | cut -d' ' -f3)
  84. echo -e " ✅ Maven版本: ${GREEN}$MVN_VERSION${NC}"
  85. else
  86. echo -e " ❌ ${RED}未找到Maven环境${NC}"
  87. return 1
  88. fi
  89. # 检查目标模块
  90. if [ -d "$DEFAULT_MODULE" ]; then
  91. echo -e " ✅ 目标模块: ${GREEN}$DEFAULT_MODULE${NC}"
  92. else
  93. echo -e " ❌ ${RED}未找到目标模块: $DEFAULT_MODULE${NC}"
  94. return 1
  95. fi
  96. # 检查热加载配置
  97. if grep -q "spring-boot-devtools" $DEFAULT_MODULE/pom.xml; then
  98. echo -e " ✅ 热加载配置: ${GREEN}已启用${NC}"
  99. else
  100. echo -e " ⚠️ 热加载配置: ${YELLOW}未配置${NC}"
  101. fi
  102. # 检查配置文件
  103. CONFIG_FILE="$DEFAULT_MODULE/src/main/resources/application-$DEFAULT_PROFILE.yml"
  104. if [ -f "$CONFIG_FILE" ]; then
  105. echo -e " ✅ 配置文件: ${GREEN}$CONFIG_FILE${NC}"
  106. else
  107. echo -e " ❌ ${RED}未找到配置文件: $CONFIG_FILE${NC}"
  108. return 1
  109. fi
  110. echo -e "${GREEN}✅ 环境检查完成${NC}"
  111. return 0
  112. }
  113. # 检查端口占用
  114. check_port() {
  115. local port=$1
  116. if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
  117. echo -e "${YELLOW}⚠️ 端口 $port 已被占用${NC}"
  118. echo -e "${CYAN}正在尝试找到占用进程...${NC}"
  119. lsof -Pi :$port -sTCP:LISTEN
  120. echo ""
  121. read -p "是否要杀死占用进程并继续启动? (y/n): " -n 1 -r
  122. echo
  123. if [[ $REPLY =~ ^[Yy]$ ]]; then
  124. echo -e "${YELLOW}正在杀死端口 $port 的占用进程...${NC}"
  125. lsof -ti:$port | xargs kill -9 2>/dev/null
  126. sleep 2
  127. echo -e "${GREEN}✅ 端口已释放${NC}"
  128. return 0
  129. else
  130. echo -e "${RED}❌ 启动已取消${NC}"
  131. exit 1
  132. fi
  133. fi
  134. return 0
  135. }
  136. # 清理编译
  137. clean_build() {
  138. echo -e "${BLUE}🧹 清理编译...${NC}"
  139. cd $DEFAULT_MODULE
  140. mvn clean > /dev/null 2>&1
  141. if [ $? -eq 0 ]; then
  142. echo -e "${GREEN}✅ 清理完成${NC}"
  143. else
  144. echo -e "${RED}❌ 清理失败${NC}"
  145. exit 1
  146. fi
  147. cd ..
  148. }
  149. # 构建项目
  150. build_project() {
  151. echo -e "${BLUE}🔨 编译项目...${NC}"
  152. cd $DEFAULT_MODULE
  153. mvn compile -q
  154. if [ $? -eq 0 ]; then
  155. echo -e "${GREEN}✅ 编译完成${NC}"
  156. else
  157. echo -e "${RED}❌ 编译失败${NC}"
  158. exit 1
  159. fi
  160. cd ..
  161. }
  162. # 启动应用
  163. start_application() {
  164. local profile=$1
  165. local port=$2
  166. local debug_mode=$3
  167. local hot_reload=$4
  168. local jvm_opts=$5
  169. echo -e "${BLUE}🚀 启动应用...${NC}"
  170. echo -e "${CYAN}配置信息:${NC}"
  171. echo -e " 📂 模块: ${GREEN}$DEFAULT_MODULE${NC}"
  172. echo -e " 🌍 环境: ${GREEN}$profile${NC}"
  173. echo -e " 🔌 端口: ${GREEN}$port${NC}"
  174. echo -e " 🔥 热加载: ${GREEN}$([ "$hot_reload" = "true" ] && echo "启用" || echo "禁用")${NC}"
  175. echo -e " 🐛 调试模式: ${GREEN}$([ "$debug_mode" = "true" ] && echo "启用" || echo "禁用")${NC}"
  176. echo ""
  177. cd $DEFAULT_MODULE
  178. # 构建Maven命令
  179. MVN_CMD="mvn spring-boot:run"
  180. # 添加环境配置
  181. MVN_CMD="$MVN_CMD -Dspring-boot.run.profiles=$profile"
  182. # 添加端口配置
  183. if [ "$port" != "$DEFAULT_PORT" ]; then
  184. MVN_CMD="$MVN_CMD -Dspring-boot.run.arguments=--server.port=$port"
  185. fi
  186. # 添加JVM参数
  187. if [ -n "$jvm_opts" ]; then
  188. MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$jvm_opts\""
  189. else
  190. MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS\""
  191. fi
  192. # 调试模式
  193. if [ "$debug_mode" = "true" ]; then
  194. MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005\""
  195. echo -e "${PURPLE}🐛 调试端口: 5005${NC}"
  196. fi
  197. # 禁用热加载
  198. if [ "$hot_reload" = "false" ]; then
  199. MVN_CMD="$MVN_CMD -Dspring.devtools.restart.enabled=false"
  200. fi
  201. echo -e "${CYAN}执行命令: ${WHITE}$MVN_CMD${NC}"
  202. echo -e "${GREEN}==================== 应用启动日志 ====================${NC}"
  203. echo ""
  204. # 执行命令
  205. eval $MVN_CMD
  206. }
  207. # 主函数
  208. main() {
  209. # 参数解析
  210. PROFILE="$DEFAULT_PROFILE"
  211. PORT="$DEFAULT_PORT"
  212. MODULE="$DEFAULT_MODULE"
  213. CLEAN_BUILD=false
  214. DEBUG_MODE=false
  215. HOT_RELOAD=true
  216. JVM_OPTS=""
  217. CHECK_ONLY=false
  218. while [[ $# -gt 0 ]]; do
  219. case $1 in
  220. -h|--help)
  221. show_help
  222. exit 0
  223. ;;
  224. -p|--profile)
  225. PROFILE="$2"
  226. shift 2
  227. ;;
  228. -P|--port)
  229. PORT="$2"
  230. shift 2
  231. ;;
  232. -m|--module)
  233. MODULE="$2"
  234. DEFAULT_MODULE="$2"
  235. shift 2
  236. ;;
  237. -c|--clean)
  238. CLEAN_BUILD=true
  239. shift
  240. ;;
  241. -d|--debug)
  242. DEBUG_MODE=true
  243. shift
  244. ;;
  245. -j|--jvm-opts)
  246. JVM_OPTS="$2"
  247. shift 2
  248. ;;
  249. -t|--test)
  250. PROFILE="test"
  251. shift
  252. ;;
  253. --no-hot)
  254. HOT_RELOAD=false
  255. shift
  256. ;;
  257. --check)
  258. CHECK_ONLY=true
  259. shift
  260. ;;
  261. *)
  262. echo -e "${RED}未知参数: $1${NC}"
  263. show_help
  264. exit 1
  265. ;;
  266. esac
  267. done
  268. # 显示Logo
  269. show_logo
  270. # 仅检查环境
  271. if [ "$CHECK_ONLY" = "true" ]; then
  272. check_environment
  273. exit $?
  274. fi
  275. # 环境检查
  276. if ! check_environment; then
  277. echo -e "${RED}❌ 环境检查失败,请检查配置${NC}"
  278. exit 1
  279. fi
  280. echo ""
  281. # 端口检查
  282. check_port $PORT
  283. # 清理编译
  284. if [ "$CLEAN_BUILD" = "true" ]; then
  285. clean_build
  286. echo ""
  287. fi
  288. # 编译项目
  289. build_project
  290. echo ""
  291. # 启动应用
  292. start_application "$PROFILE" "$PORT" "$DEBUG_MODE" "$HOT_RELOAD" "$JVM_OPTS"
  293. }
  294. # 错误处理
  295. trap 'echo -e "\n${YELLOW}⚠️ 应用启动已中断${NC}"; exit 1' INT TERM
  296. # 执行主函数
  297. main "$@"