hot-start.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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 clean package -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. # 新增:构建 ruoyi-modules
  163. build_ruoyi_modules() {
  164. echo -e "${BLUE}🔨 开始编译并打包 ruoyi-modules...${NC}"
  165. cd ruoyi-modules
  166. mvn clean install -q
  167. if [ $? -eq 0 ]; then
  168. echo -e "${GREEN}✅ ruoyi-modules 编译打包完成${NC}"
  169. else
  170. echo -e "${RED}❌ ruoyi-modules 编译打包失败${NC}"
  171. exit 1
  172. fi
  173. cd ..
  174. }
  175. # 启动应用
  176. start_application() {
  177. local profile=$1
  178. local port=$2
  179. local debug_mode=$3
  180. local hot_reload=$4
  181. local jvm_opts=$5
  182. echo -e "${BLUE}🚀 启动应用...${NC}"
  183. echo -e "${CYAN}配置信息:${NC}"
  184. echo -e " 📂 模块: ${GREEN}$DEFAULT_MODULE${NC}"
  185. echo -e " 🌍 环境: ${GREEN}$profile${NC}"
  186. echo -e " 🔌 端口: ${GREEN}$port${NC}"
  187. echo -e " 🔥 热加载: ${GREEN}$([ "$hot_reload" = "true" ] && echo "启用" || echo "禁用")${NC}"
  188. echo -e " 🐛 调试模式: ${GREEN}$([ "$debug_mode" = "true" ] && echo "启用" || echo "禁用")${NC}"
  189. echo ""
  190. cd $DEFAULT_MODULE
  191. # 构建Maven命令
  192. MVN_CMD="mvn spring-boot:run"
  193. # 添加环境配置
  194. MVN_CMD="$MVN_CMD -Dspring-boot.run.profiles=$profile"
  195. # 添加端口配置
  196. if [ "$port" != "$DEFAULT_PORT" ]; then
  197. MVN_CMD="$MVN_CMD -Dspring-boot.run.arguments=--server.port=$port"
  198. fi
  199. # 添加JVM参数
  200. if [ -n "$jvm_opts" ]; then
  201. MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$jvm_opts\""
  202. else
  203. MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS\""
  204. fi
  205. # 调试模式
  206. if [ "$debug_mode" = "true" ]; then
  207. MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005\""
  208. echo -e "${PURPLE}🐛 调试端口: 5005${NC}"
  209. fi
  210. # 禁用热加载
  211. if [ "$hot_reload" = "false" ]; then
  212. MVN_CMD="$MVN_CMD -Dspring.devtools.restart.enabled=false"
  213. fi
  214. echo -e "${CYAN}执行命令: ${WHITE}$MVN_CMD${NC}"
  215. echo -e "${GREEN}==================== 应用启动日志 ====================${NC}"
  216. echo ""
  217. # 执行命令
  218. eval $MVN_CMD
  219. }
  220. # 主函数
  221. main() {
  222. # 参数解析
  223. PROFILE="$DEFAULT_PROFILE"
  224. PORT="$DEFAULT_PORT"
  225. MODULE="$DEFAULT_MODULE"
  226. CLEAN_BUILD=false
  227. DEBUG_MODE=false
  228. HOT_RELOAD=true
  229. JVM_OPTS=""
  230. CHECK_ONLY=false
  231. while [[ $# -gt 0 ]]; do
  232. case $1 in
  233. -h|--help)
  234. show_help
  235. exit 0
  236. ;;
  237. -p|--profile)
  238. PROFILE="$2"
  239. shift 2
  240. ;;
  241. -P|--port)
  242. PORT="$2"
  243. shift 2
  244. ;;
  245. -m|--module)
  246. MODULE="$2"
  247. DEFAULT_MODULE="$2"
  248. shift 2
  249. ;;
  250. -c|--clean)
  251. CLEAN_BUILD=true
  252. shift
  253. ;;
  254. -d|--debug)
  255. DEBUG_MODE=true
  256. shift
  257. ;;
  258. -j|--jvm-opts)
  259. JVM_OPTS="$2"
  260. shift 2
  261. ;;
  262. -t|--test)
  263. PROFILE="test"
  264. shift
  265. ;;
  266. --no-hot)
  267. HOT_RELOAD=false
  268. shift
  269. ;;
  270. --check)
  271. CHECK_ONLY=true
  272. shift
  273. ;;
  274. *)
  275. echo -e "${RED}未知参数: $1${NC}"
  276. show_help
  277. exit 1
  278. ;;
  279. esac
  280. done
  281. # 显示Logo
  282. show_logo
  283. # 仅检查环境
  284. if [ "$CHECK_ONLY" = "true" ]; then
  285. check_environment
  286. exit $?
  287. fi
  288. # 环境检查
  289. if ! check_environment; then
  290. echo -e "${RED}❌ 环境检查失败,请检查配置${NC}"
  291. exit 1
  292. fi
  293. echo ""
  294. # 端口检查
  295. check_port $PORT
  296. # 清理编译
  297. if [ "$CLEAN_BUILD" = "true" ]; then
  298. clean_build
  299. echo ""
  300. fi
  301. # 先编译打包 ruoyi-modules
  302. build_ruoyi_modules
  303. echo ""
  304. # 再编译打包 ruoyi-admin
  305. build_project
  306. echo ""
  307. # 启动应用
  308. start_application "$PROFILE" "$PORT" "$DEBUG_MODE" "$HOT_RELOAD" "$JVM_OPTS"
  309. }
  310. # 错误处理
  311. trap 'echo -e "\n${YELLOW}⚠️ 应用启动已中断${NC}"; exit 1' INT TERM
  312. # 执行主函数
  313. main "$@"