windows自动打包部署Java程序
项目部署在windows服务器上,编写bat批处理脚本进行自动化部署
准备工作
在目标服务器上安装Java、Maven、其他需要安装的软件,并配置环境变量
总流程
停止程序
停止正在运行的Java程序和与Java一同运行的程序,如果这些程序未停止,会导致文件占用无法删除和无法启动
设置需要关闭的端口,通过查询端口获取PID,关闭对应端口的程序
这里8100端口是Java程序的,9996是定时任务程序的端口
@echo off
rem 设置监听的端口号
set java-port=8100
set job-port=9996
echo java-port : %java-port%
echo job-port : %job-port%
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %java-port%`) do (
if [%%d] EQU [LISTENING] (
set java-pid=%%e
)
)
for /f "usebackq tokens=1-5" %%a in (`tasklist ^| findstr %java-pid%`) do (
set java_name=%%a
)
rem 根据进程ID,kill进程
taskkill /f /pid %java-pid%
echo kill process : port %java-port%, pid %java-pid% ,name %java_name%
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %job-port%`) do (
if [%%d] EQU [LISTENING] (
set job-pid=%%e
)
)
for /f "usebackq tokens=1-5" %%a in (`tasklist ^| findstr %job-pid%`) do (
set job_name=%%a
)
taskkill /f /pid %job-pid%
echo kill process : port %job-port%, pid %job-pid% , name %job_name%
删除项目的代码
因为每次都是去git上拉取最新代码,然后通过Maven打包。上个版本的代码不需要防止冲突问题,这里直接删除掉整个工程文件。
这里第一个项目project-a是公共依赖模块,第二个项目project-b是我们真正要运行的
rmdir project-a /s /q
rmdir project-b /s /q
拉取代码
拉去两个项目的最新代码,切换到需要发布的分支(完成后,目录记得回到主文件夹)
git clone https://gitee.com/****/project-a.git
git clone https://gitee.com/***/project-b.git
cd project-a
git checkout dev
cd ../project-b
git checkout dev
cd ../
Maven清理和打包
执行mvn clean清理两个工程的target, 因为工程b要依赖于工程a,所以a打包完成后,需要执行install将jar依赖加入到maven仓库,才能执行b的打包(注意clean操作要在a install之前操作)
这里有一个坑,mvn的命令都是批处理命令,如果在bat中直接执行,执行完mvn命令后会直接退出,在mvn前面加上call可以解决这个问题
call mvn clean
cd ../project-a
call mvn clean
call mvn package
call mvn install:install-file -Dfile=C:\文件地址\target\project-a.jar -DgroupId=**.**.** -DartifactId=**.**.** -Dversion=1.0.0 -Dpackaging=jar
cd ../project-b
call mvn package
运行
执行project-b的jar包,运行java程序
cd project-b\target
javaw -jar project-b.jar
将所有命令放入bat文件中,并放入与项目a,b同级目录,每次发版执行bat脚本即可。