| 对于Spring Boot应用,引入外部`redismng.jar`包的启动脚本需要特别注意其类加载机制(Spring Boot的jar包结构特殊,内部有`BOOT-INF`等目录,依赖`JarLauncher`加载)。以下是针对**Linux(shell脚本)** 和**Windows(bat脚本)** 的详细写法,假设你的Spring Boot应用jar包为`app.jar`,`redismng.jar`放在应用同级的`lib`目录下(便于管理)。 ### 一、目录结构约定 建议将文件按以下结构存放(路径可自定义,脚本中对应修改即可): ``` your-app/ ├── app.jar # 你的Spring Boot应用jar包 ├── lib/ # 存放外部依赖包 │ └── redismng.jar # 需要引入的redismng.jar ├── start.sh # Linux启动脚本 └── start.bat # Windows启动脚本 ``` ### 二、Linux启动脚本(start.sh) ```bash #!/bin/bash # 应用名称(自定义,用于日志或进程标识) APP_NAME="my-springboot-app" # Spring Boot应用jar包路径(相对路径,基于脚本执行目录) APP_JAR="app.jar" # 外部依赖包redismng.jar路径(放在lib目录下) REDIS_MNG_JAR="lib/redismng.jar" # Spring Boot启动类(固定,从app.jar的MANIFEST.MF中Main-Class获取,通常是JarLauncher) MAIN_CLASS="org.springframework.boot.loader.JarLauncher" # JVM参数(根据需要调整,如内存设置) JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC" # 日志输出文件 LOG_FILE="app.log" # 检查应用jar是否存在 if [ ! -f "$APP_JAR" ]; then echo "错误:未找到应用jar包 $APP_JAR,请检查路径是否正确!" exit 1 fi # 检查redismng.jar是否存在 if [ ! -f "$REDIS_MNG_JAR" ]; then echo "错误:未找到redismng.jar包 $REDIS_MNG_JAR,请检查路径是否正确!" exit 1 fi # 启动命令(classpath包含应用jar和redismng.jar,用冒号分隔) echo "启动 $APP_NAME 应用..." nohup java $JVM_OPTS -cp "$APP_JAR:$REDIS_MNG_JAR" $MAIN_CLASS > $LOG_FILE 2>&1 & # 输出启动结果 sleep 2 if ps -ef | grep "$APP_JAR" | grep -v grep > /dev/null; then echo "$APP_NAME 启动成功,日志输出至 $LOG_FILE" else echo "$APP_NAME 启动失败,请查看 $LOG_FILE 日志排查问题" fi ``` ### 三、Windows启动脚本(start.bat) ```cmd @echo off :: 应用名称(自定义) set APP_NAME=my-springboot-app :: Spring Boot应用jar包路径(相对路径) set APP_JAR=app.jar :: 外部依赖包redismng.jar路径(放在lib目录下) set REDIS_MNG_JAR=lib\redismng.jar :: Spring Boot启动类(固定,通常是JarLauncher) set MAIN_CLASS=org.springframework.boot.loader.JarLauncher :: JVM参数(根据需要调整) set JVM_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC :: 日志输出文件 set LOG_FILE=app.log :: 检查应用jar是否存在 if not exist "%APP_JAR%" ( echo 错误:未找到应用jar包 %APP_JAR%,请检查路径是否正确! pause exit /b 1 ) :: 检查redismng.jar是否存在 if not exist "%REDIS_MNG_JAR%" ( echo 错误:未找到redismng.jar包 %REDIS_MNG_JAR%,请检查路径是否正确! pause exit /b 1 ) :: 启动命令(classpath包含应用jar和redismng.jar,用分号分隔) echo 启动 %APP_NAME% 应用... start /b java %JVM_OPTS% -cp "%APP_JAR%;%REDIS_MNG_JAR%" %MAIN_CLASS% > %LOG_FILE% 2>&1 :: 输出启动结果 timeout /t 2 /nobreak > nul tasklist /fi "imagename eq java.exe" /fi "cmdline eq *%APP_JAR%*" | findstr /i "java.exe" > nul if %errorlevel% equ 0 ( echo %APP_NAME% 启动成功,日志输出至 %LOG_FILE% ) else ( echo %APP_NAME% 启动失败,请查看 %LOG_FILE% 日志排查问题 ) pause ``` ### 关键说明 1. **启动类(Main-Class)**: Spring Boot的jar包中,`META-INF/MANIFEST.MF`的`Main-Class`默认是`org.springframework.boot.loader.JarLauncher`(负责加载Spring Boot的特殊目录结构),而非你的应用主类(应用主类在`Start-Class`中)。因此脚本中必须指定`JarLauncher`作为主类,否则会报类加载错误。 2. **ClassPath路径**: - Linux用冒号`:`分隔多个jar路径,Windows用分号`;`分隔。 - 必须将`app.jar`和`redismng.jar`都加入ClassPath,否则Spring Boot无法加载外部依赖。 3. **路径调整**: 若`redismng.jar`与`app.jar`在同一目录,直接写`redismng.jar`即可(无需`lib/`前缀)。 4. **依赖冲突**: 若`redismng.jar`与Spring Boot自带的依赖(如Redis客户端)版本冲突,需在脚本中通过`-Xbootclasspath/p:`强制指定加载顺序,或排除冲突依赖。 5. **权限**: Linux脚本需要执行权限,通过`chmod +x start.sh`赋予后再启动。 通过以上脚本,Spring Boot应用会正确加载`redismng.jar`并启动,日志会输出到指定文件便于排查问题。 |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-11-24 12:33 , Processed in 0.047786 second(s), 17 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.