当前使用 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
pauseSpring Boot 配置外部化,请参考“外部配置化”。