当前使用 Spring Boot 快速开发应用已成为主流,Spring Boot 应用打包出来通常是一个可执行的 jar 文件。每次运行应用我们都需要使用 java -jar demo_app.jar 的方式去运行,这是非常麻烦的。
本文将介绍怎样通过命令行脚本去启动和停止 Spring Boot 应用,这里停止 Spring Boot 应用借助了 pid 文件。具体步骤如下:
(1)先看看我们的应用目录结构,如下图:
上图中,各个文件和目录作用如下:
config 目录用来存放应用的配置文件
logs 目录用来存放应用日志信息
jre1.8 则是存放的一个可以使用的 jre 运行环境,该 jre 通常将我们开发应用时使用的 jre 环境拷贝出来,这样可以避免发布到某台机器没有安装 jdk,或者没有配置 java 环境变量等问题,也能避免开发和实际运行的 jdk 版本不一致导致的兼容等等一系列问题,通常这个 jre 目录有接近 200MB 大小
demo-app.jar 则是应用的可执行 jar 文件
start.bat 是应用启动脚本
stop.bat 是应用停止脚本
(2)修改 Spring Boot 应用的启动类,在启动类中通过添加 ApplicationPidFileWriter 监听器实现应用启动时在当前目录下创建 application.pid 文件,代码如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.system.ApplicationPidFileWriter; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; /** * Spring Boot 项目启动类 * @author hxstrive.com */ @SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(DemoApplication.class); springApplication.addListeners(new ApplicationPidFileWriter()); springApplication.run(args); } }
(3)start.bat 脚本
@echo off setlocal set current_dir=%~dp0 set basePath=%current_dir:~0,-1% rem 复制一个java.exe且命名为demo-app.exe是为了方便监测服务进程 set java_exe=demo-app.exe rem 服务的jar文件名 set jar_name=demo-app.jar if not "%demo_home%" == "" goto gotHome set "demo_home=%basePath%\.." :gotHome rem 判断当前服务主目录下是否存在 java.exe if not exist %demo_home%\jre1.8\bin\java.exe ( echo not found java.exe goto error_end ) rem 判断demo-app.exe是否存在,不存在则复制一个java.exe且命名为demo-app.exe if not exist %demo_home%\jre1.8\bin\%java_exe% ( echo create %java_exe% file copy /y %demo_home%\jre1.8\bin\java.exe %demo_home%\jre1.8\bin\%java_exe% ) rem 通过 -Xbootclasspath 将 config 目录指定为 Spring Boot 的配置目录 start "demo_server" %demo_home%\jre1.8\bin\%java_exe% -Xbootclasspath/a:%basePath%\config -jar %jar_name% goto end :error_end pause :end
(4)stop.bat 脚本
@echo off setlocal set basePath=%~dp0 if not "%demo_home%" == "" goto gotHome set "demo_home=%basePath%\.." :gotHome if not exist %basePath%\application.pid ( echo not found application.pid goto end ) rem 根据进程PID结束进程 set /p pid=<%basePath%\application.pid taskkill /f /pid %pid% echo success shutdown demo_server. rem 服务结束后,删除pid文件 del %basePath%\application.pid /q :end pause
Spring Boot 配置外部化,请参考“外部配置化”。