hot-start.bat 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. @echo off
  2. chcp 65001 >nul
  3. setlocal EnableDelayedExpansion
  4. :: =============================================================================
  5. :: RuoYi-Vue-Plus 热启动脚本 (Windows版)
  6. :: 功能:启动应用并支持热加载、多环境切换等功能
  7. :: 位置:backend/hot-start.bat
  8. :: 作者:zlwu
  9. :: 时间:2025-07-01
  10. :: =============================================================================
  11. :: 默认配置
  12. set DEFAULT_PROFILE=dev
  13. set DEFAULT_PORT=8080
  14. set DEFAULT_MODULE=ruoyi-admin
  15. set MAVEN_OPTS=-Xms512m -Xmx2048m -XX:+UseG1GC
  16. :: 脚本信息
  17. set SCRIPT_NAME=RuoYi热启动脚本
  18. set SCRIPT_VERSION=1.0.0
  19. :: 参数初始化
  20. set PROFILE=%DEFAULT_PROFILE%
  21. set PORT=%DEFAULT_PORT%
  22. set MODULE=%DEFAULT_MODULE%
  23. set CLEAN_BUILD=false
  24. set DEBUG_MODE=false
  25. set HOT_RELOAD=true
  26. set JVM_OPTS=
  27. set CHECK_ONLY=false
  28. :: 显示Logo
  29. :show_logo
  30. echo.
  31. echo ==================================================================================
  32. echo ____ __ ___ _ _ _ _ ____ _ _
  33. echo ^| _ \ _ _ ___ ^| \/ ^(_^) ^| ^| ^| ^| ___ ^| ^|_ / ___^|^| ^|_ __ _ _ __^| ^|_
  34. echo ^| ^|_^) ^| ^| ^| ^|/ _ \ ^| ^|\/^| ^| ^|_____^| ^|_^| ^|/ _ \^| __^| \___ \^| __/ _` ^| '__^| __^|
  35. echo ^| _ ^<^| ^|_^| ^| ^(_^) ^|^| ^| ^| ^| ^|_____^| _ ^| ^(_^) ^| ^|_ ___^) ^| ^|^| ^(_^| ^| ^| ^| ^|_
  36. echo ^|_^| \_\\__,_^|\___/ ^|_^| ^|_^|_^| ^|_^| ^|_^|\___/ \__^| ^|____/ \__\__,_^|_^| \__^|
  37. echo.
  38. echo 🚀 %SCRIPT_NAME% v%SCRIPT_VERSION% 🚀
  39. echo ==================================================================================
  40. echo.
  41. goto :eof
  42. :: 显示帮助信息
  43. :show_help
  44. echo 用法: %~nx0 [选项]
  45. echo.
  46. echo 选项:
  47. echo -h, --help 显示此帮助信息
  48. echo -p, --profile 指定环境配置 ^(dev/test/prod,默认: dev^)
  49. echo -P, --port 指定端口号 ^(默认: 8080^)
  50. echo -c, --clean 清理编译后启动
  51. echo -d, --debug 启用调试模式
  52. echo -t, --test 测试模式启动
  53. echo --no-hot 禁用热加载功能
  54. echo --check 检查环境配置
  55. echo.
  56. echo 示例:
  57. echo %~nx0 # 使用默认配置启动^(开发环境+热加载^)
  58. echo %~nx0 -p prod # 生产环境启动
  59. echo %~nx0 -P 9090 # 指定端口9090启动
  60. echo %~nx0 -c # 清理编译后启动
  61. echo %~nx0 -d # 调试模式启动
  62. echo %~nx0 --no-hot # 禁用热加载启动
  63. echo %~nx0 --check # 检查环境配置
  64. echo.
  65. echo 🔥 热加载功能说明:
  66. echo - 开发环境默认启用热加载,修改代码后自动重启
  67. echo - 支持Java代码、配置文件、MyBatis映射文件热加载
  68. echo - 详细配置见: docs/开发文档/热加载配置说明.md
  69. goto :eof
  70. :: 检查环境
  71. :check_environment
  72. echo 🔍 检查运行环境...
  73. :: 检查Java版本
  74. java -version >nul 2>&1
  75. if !errorlevel! neq 0 (
  76. echo ❌ 未找到Java环境
  77. exit /b 1
  78. ) else (
  79. for /f "tokens=3" %%a in ('java -version 2^>^&1 ^| findstr "version"') do (
  80. set JAVA_VERSION=%%a
  81. set JAVA_VERSION=!JAVA_VERSION:"=!
  82. echo ✅ Java版本: !JAVA_VERSION!
  83. )
  84. )
  85. :: 检查Maven版本
  86. mvn -version >nul 2>&1
  87. if !errorlevel! neq 0 (
  88. echo ❌ 未找到Maven环境
  89. exit /b 1
  90. ) else (
  91. for /f "tokens=3" %%a in ('mvn -version 2^>nul ^| findstr "Apache Maven"') do (
  92. echo ✅ Maven版本: %%a
  93. )
  94. )
  95. :: 检查目标模块
  96. if exist "%DEFAULT_MODULE%" (
  97. echo ✅ 目标模块: %DEFAULT_MODULE%
  98. ) else (
  99. echo ❌ 未找到目标模块: %DEFAULT_MODULE%
  100. exit /b 1
  101. )
  102. :: 检查热加载配置
  103. findstr /c:"spring-boot-devtools" "%DEFAULT_MODULE%\pom.xml" >nul 2>&1
  104. if !errorlevel! equ 0 (
  105. echo ✅ 热加载配置: 已启用
  106. ) else (
  107. echo ⚠️ 热加载配置: 未配置
  108. )
  109. :: 检查配置文件
  110. if exist "%DEFAULT_MODULE%\src\main\resources\application-%DEFAULT_PROFILE%.yml" (
  111. echo ✅ 配置文件: %DEFAULT_MODULE%\src\main\resources\application-%DEFAULT_PROFILE%.yml
  112. ) else (
  113. echo ❌ 未找到配置文件: %DEFAULT_MODULE%\src\main\resources\application-%DEFAULT_PROFILE%.yml
  114. exit /b 1
  115. )
  116. echo ✅ 环境检查完成
  117. exit /b 0
  118. :: 检查端口占用
  119. :check_port
  120. netstat -an | findstr ":%PORT% " >nul 2>&1
  121. if !errorlevel! equ 0 (
  122. echo ⚠️ 端口 %PORT% 已被占用
  123. echo 正在尝试找到占用进程...
  124. for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%PORT% "') do (
  125. set PID=%%a
  126. for /f "tokens=1" %%b in ('tasklist /fi "pid eq !PID!" /fo csv /nh') do (
  127. set PROCESS_NAME=%%b
  128. set PROCESS_NAME=!PROCESS_NAME:"=!
  129. echo 进程: !PROCESS_NAME! ^(PID: !PID!^)
  130. )
  131. )
  132. echo.
  133. set /p REPLY="是否要杀死占用进程并继续启动? (y/n): "
  134. if /i "!REPLY!"=="y" (
  135. echo 正在杀死端口 %PORT% 的占用进程...
  136. for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%PORT% "') do (
  137. taskkill /pid %%a /f >nul 2>&1
  138. )
  139. timeout /t 2 /nobreak >nul
  140. echo ✅ 端口已释放
  141. ) else (
  142. echo ❌ 启动已取消
  143. exit /b 1
  144. )
  145. )
  146. exit /b 0
  147. :: 清理编译
  148. :clean_build
  149. echo 🧹 清理编译...
  150. cd /d "%DEFAULT_MODULE%"
  151. mvn clean >nul 2>&1
  152. if !errorlevel! equ 0 (
  153. echo ✅ 清理完成
  154. ) else (
  155. echo ❌ 清理失败
  156. exit /b 1
  157. )
  158. cd ..
  159. exit /b 0
  160. :: 构建项目
  161. :build_project
  162. echo 🔨 编译项目...
  163. cd /d "%DEFAULT_MODULE%"
  164. mvn compile -q
  165. if !errorlevel! equ 0 (
  166. echo ✅ 编译完成
  167. ) else (
  168. echo ❌ 编译失败
  169. exit /b 1
  170. )
  171. cd ..
  172. exit /b 0
  173. :: 启动应用
  174. :start_application
  175. echo 🚀 启动应用...
  176. echo 配置信息:
  177. echo 📂 模块: %DEFAULT_MODULE%
  178. echo 🌍 环境: %PROFILE%
  179. echo 🔌 端口: %PORT%
  180. if "%HOT_RELOAD%"=="true" (
  181. echo 🔥 热加载: 启用
  182. ) else (
  183. echo 🔥 热加载: 禁用
  184. )
  185. if "%DEBUG_MODE%"=="true" (
  186. echo 🐛 调试模式: 启用
  187. ) else (
  188. echo 🐛 调试模式: 禁用
  189. )
  190. echo.
  191. cd /d "%DEFAULT_MODULE%"
  192. :: 构建Maven命令
  193. set MVN_CMD=mvn spring-boot:run
  194. :: 添加环境配置
  195. set MVN_CMD=%MVN_CMD% -Dspring-boot.run.profiles=%PROFILE%
  196. :: 添加端口配置
  197. if not "%PORT%"=="%DEFAULT_PORT%" (
  198. set MVN_CMD=%MVN_CMD% -Dspring-boot.run.arguments=--server.port=%PORT%
  199. )
  200. :: 添加JVM参数
  201. if not "%JVM_OPTS%"=="" (
  202. set MVN_CMD=%MVN_CMD% -Dspring-boot.run.jvmArguments="%JVM_OPTS%"
  203. ) else (
  204. set MVN_CMD=%MVN_CMD% -Dspring-boot.run.jvmArguments="%MAVEN_OPTS%"
  205. )
  206. :: 调试模式
  207. if "%DEBUG_MODE%"=="true" (
  208. set MVN_CMD=%MVN_CMD% -Dspring-boot.run.jvmArguments="%MAVEN_OPTS% -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
  209. echo 🐛 调试端口: 5005
  210. )
  211. :: 禁用热加载
  212. if "%HOT_RELOAD%"=="false" (
  213. set MVN_CMD=%MVN_CMD% -Dspring.devtools.restart.enabled=false
  214. )
  215. echo 执行命令: %MVN_CMD%
  216. echo ==================== 应用启动日志 ====================
  217. echo.
  218. :: 执行命令
  219. %MVN_CMD%
  220. exit /b 0
  221. :: 参数解析
  222. :parse_args
  223. if "%~1"=="" goto args_done
  224. if "%~1"=="-h" goto show_help_and_exit
  225. if "%~1"=="--help" goto show_help_and_exit
  226. if "%~1"=="-p" (
  227. set PROFILE=%~2
  228. shift
  229. shift
  230. goto parse_args
  231. )
  232. if "%~1"=="--profile" (
  233. set PROFILE=%~2
  234. shift
  235. shift
  236. goto parse_args
  237. )
  238. if "%~1"=="-P" (
  239. set PORT=%~2
  240. shift
  241. shift
  242. goto parse_args
  243. )
  244. if "%~1"=="--port" (
  245. set PORT=%~2
  246. shift
  247. shift
  248. goto parse_args
  249. )
  250. if "%~1"=="-c" (
  251. set CLEAN_BUILD=true
  252. shift
  253. goto parse_args
  254. )
  255. if "%~1"=="--clean" (
  256. set CLEAN_BUILD=true
  257. shift
  258. goto parse_args
  259. )
  260. if "%~1"=="-d" (
  261. set DEBUG_MODE=true
  262. shift
  263. goto parse_args
  264. )
  265. if "%~1"=="--debug" (
  266. set DEBUG_MODE=true
  267. shift
  268. goto parse_args
  269. )
  270. if "%~1"=="-t" (
  271. set PROFILE=test
  272. shift
  273. goto parse_args
  274. )
  275. if "%~1"=="--test" (
  276. set PROFILE=test
  277. shift
  278. goto parse_args
  279. )
  280. if "%~1"=="--no-hot" (
  281. set HOT_RELOAD=false
  282. shift
  283. goto parse_args
  284. )
  285. if "%~1"=="--check" (
  286. set CHECK_ONLY=true
  287. shift
  288. goto parse_args
  289. )
  290. echo 未知参数: %~1
  291. call :show_help
  292. exit /b 1
  293. :show_help_and_exit
  294. call :show_help
  295. exit /b 0
  296. :args_done
  297. :: 主程序
  298. :main
  299. :: 显示Logo
  300. call :show_logo
  301. :: 仅检查环境
  302. if "%CHECK_ONLY%"=="true" (
  303. call :check_environment
  304. exit /b !errorlevel!
  305. )
  306. :: 环境检查
  307. call :check_environment
  308. if !errorlevel! neq 0 (
  309. echo ❌ 环境检查失败,请检查配置
  310. exit /b 1
  311. )
  312. echo.
  313. :: 端口检查
  314. call :check_port
  315. if !errorlevel! neq 0 exit /b 1
  316. :: 清理编译
  317. if "%CLEAN_BUILD%"=="true" (
  318. call :clean_build
  319. if !errorlevel! neq 0 exit /b 1
  320. echo.
  321. )
  322. :: 编译项目
  323. call :build_project
  324. if !errorlevel! neq 0 exit /b 1
  325. echo.
  326. :: 启动应用
  327. call :start_application
  328. exit /b 0
  329. :: 解析参数并执行主程序
  330. call :parse_args %*
  331. call :main