使用到的工具
NSIS
NSIS(Nullsoft Scriptable Install System),即脚本安装系统,是一个开源且免费的工具,主要用于构建Windows平台下的安装包(安装程序),NSIS能够创建具备安装、卸载、设置系统设置以及解压文件等基本功能的安装程序。NSIS是一个功能强大、灵活且易于使用的工具,它为Windows平台下的应用程序安装包制作提供了全面的解决方案。
Quick Batch File Compiler
Quick Batch File Compiler是一款功能强大的软件,其主要作用体现在将批处理文件(.bat、.cmd格式)转换为真正的可执行程序(.exe格式)。
批处理文件转exe:Quick Batch File Compiler能够将.bat或.cmd格式的批处理文件转换为.exe格式的可执行文件。这种转换使得原本只能通过双击运行或在命令行中执行的批处理文件,能够以更加用户友好的方式被执行,无需用户了解批处理文件的运行方式。
nssm
下载地址:https://nssm.cc/release/nssm-2.24.zip
NSSM(Non-Sucking Service Manager)是一个免费、开源的Windows服务管理工具,它的主要作用和功能是:
- 用户将任何可执行文件(包括EXE、BAT脚本、Java JAR文件等)封装并注册为Windows系统服务。这意味着这些应用程序可以像系统服务一样,具备自动启动、后台运行、故障恢复等功能。
- 通过封装为服务,应用程序可以获得更高的运行稳定性和可靠性,以及更好的系统集成能力。
- 可通过图形化界面方式创建服务,也可编写bat脚本代码后执行脚本创建服务。
nssm的使用案例:
执行脚本,将脚本同级目录下的StartJar.exe可执行文件做成自启动服务
- 将nssm.exe文件放到脚本同级目录;
- 编写脚本代码:
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit @echo off SETLOCAL EnableDelayedExpansion :: 假设脚本和nssm.exe在同一目录下 set NSSM_PATH=%~dp0nssm.exe :: 设置服务的名称和对应的可执行文件路径 set JAR_SERVICE_NAME=CAE_StartJar_Service set JAR_EXE_PATH=%~dp0StartJar.exe :: 停止JAR服务(如果正在运行),并删除服务 net stop %JAR_SERVICE_NAME% 2>nul if %ERRORLEVEL%==0 ( echo %JAR_SERVICE_NAME% 停止了. ) sc query %JAR_SERVICE_NAME% >nul 2>&1 if %ERRORLEVEL%==0 ( echo 正在删除服务 %JAR_SERVICE_NAME%... sc delete %JAR_SERVICE_NAME% ) :: 安装服务 echo 开始安装服务... "%NSSM_PATH%" install %JAR_SERVICE_NAME% "%JAR_EXE_PATH%" :: 设置服务为自动启动 echo 设置服务为自动启动... sc config %JAR_SERVICE_NAME% start= auto :: 启动服务 echo 启动服务... net start %JAR_SERVICE_NAME% ENDLOCAL echo. echo 安装完成 :pause
-
执行脚本即可;
制作exe安装包
将需要的文件夹和文件放到my_caePackFile目录
jre是后端jar包的运行环境;
可将mysql的空的data文件夹替换成已有数据的data文件夹,mysql服务安装后就有了对应的数据库而不需要再次创建数据库;
编写redis的初始化脚本,exe安装时会执行该脚本将redis做成自启动服务:
还需包含后端jar包、前端nginx、说明文档等;
编写各脚本
安装脚本:
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
@echo off
echo ****************************************
echo.
echo 开始安装环境,请不要关闭窗口
echo.
echo 正在以管理员身份安装运行
echo.
echo ****************************************
echo.
rem **************安装mysql*****************
echo.
echo 安装MYSQL
call %~dp0%mysql\mysql_init.bat
echo.
echo MYSQL安装完成
rem ***************安装缓存服务***************
echo.
echo 开始安装缓存服务
call %~dp0%redis\redis_init.bat
echo.
echo 缓存服务安装完成
rem ***************重新创建jar、nginx、form对应的自启动服务,并启动***************
SETLOCAL EnableDelayedExpansion
:: 假设脚本和nssm.exe在同一目录下
set NSSM_PATH=%~dp0nssm.exe
:: 设置服务的名称和对应的可执行文件路径
set JAR_SERVICE_NAME=CAE_StartJar_Service
set JAR_EXE_PATH=%~dp0StartJar.exe
set NGINX_35695_SERVICE_NAME=CAE_Nginx_35695_Service
set NGINX_35695_EXE_PATH=%~dp0nginx\nginx_35695.exe
set NGINX_35697_SERVICE_NAME=CAE_Nginx_35697_Service
set NGINX_35697_EXE_PATH=%~dp0form\nginx_35697.exe
:: 停止并删除已存在的服务
echo 停止并删除已存在的服务...
:: 停止JAR服务(如果正在运行),并删除服务
net stop %JAR_SERVICE_NAME% 2>nul
if %ERRORLEVEL%==0 (
echo %JAR_SERVICE_NAME% 停止了.
)
sc query %JAR_SERVICE_NAME% >nul 2>&1
if %ERRORLEVEL%==0 (
echo 正在删除服务 %JAR_SERVICE_NAME%...
sc delete %JAR_SERVICE_NAME%
)
:: 停止Nginx 35695服务(如果正在运行),并删除服务
net stop %NGINX_35695_SERVICE_NAME% 2>nul
if %ERRORLEVEL%==0 (
echo %NGINX_35695_SERVICE_NAME% 停止了.
)
sc query %NGINX_35695_SERVICE_NAME% >nul 2>&1
if %ERRORLEVEL%==0 (
echo 正在删除服务 %NGINX_35695_SERVICE_NAME%...
sc delete %NGINX_35695_SERVICE_NAME%
)
:: 停止Nginx 35697服务(如果正在运行),并删除服务
net stop %NGINX_35697_SERVICE_NAME% 2>nul
if %ERRORLEVEL%==0 (
echo %NGINX_35697_SERVICE_NAME% 停止了.
)
sc query %NGINX_35697_SERVICE_NAME% >nul 2>&1
if %ERRORLEVEL%==0 (
echo 正在删除服务 %NGINX_35697_SERVICE_NAME%...
sc delete %NGINX_35697_SERVICE_NAME%
)
:: 安装服务
echo 开始安装服务...
"%NSSM_PATH%" install %JAR_SERVICE_NAME% "%JAR_EXE_PATH%"
"%NSSM_PATH%" install %NGINX_35695_SERVICE_NAME% "%NGINX_35695_EXE_PATH%"
"%NSSM_PATH%" install %NGINX_35697_SERVICE_NAME% "%NGINX_35697_EXE_PATH%"
:: 设置服务为自动启动
echo 设置服务为自动启动...
sc config %JAR_SERVICE_NAME% start= auto
sc config %NGINX_35695_SERVICE_NAME% start= auto
sc config %NGINX_35697_SERVICE_NAME% start= auto
:: 启动服务
echo 启动服务...
net start %JAR_SERVICE_NAME%
net start %NGINX_35695_SERVICE_NAME%
net start %NGINX_35697_SERVICE_NAME%
echo 所有服务已被安装,并设置成自动启动,并已经启动成功。
ENDLOCAL
echo.
echo 安装完成
:pause
该脚本通过nssm.exe会将后端、前端做成自启动服务。
启动后端jar包的脚本:
@echo off
:: 启动 Java 应用程序
"%~dp0jre\bin\javaw.exe" -Dfile.encoding=UTF-8 -jar "%~dp0wcat-manage-admin-1.0.1-SNAPSHOT.jar"
启动该系统(前端、后端)的脚本:
rem 该脚本暂未使用,已在start-browser.bat中启动服务
@echo off
title CAE
rem ***************启动jar、nginx、form对应的自启动服务***************
set JAR_SERVICE_NAME=CAE_StartJar_Service
set NGINX_35695_SERVICE_NAME=CAE_Nginx_35695_Service
set NGINX_35697_SERVICE_NAME=CAE_Nginx_35697_Service
set port=100
for /f "tokens=5" %%a in ('netstat /ano ^| findstr 35696') do (
set port=%%a
)
if %port%==100 (
echo.
echo 后台服务启动中...
net start %JAR_SERVICE_NAME%
timeout /nobreak /t 30
)
echo.
echo 表单服务启动中...
net start %NGINX_35697_SERVICE_NAME%
echo.
echo 前台服务启动中...
net start %NGINX_35695_SERVICE_NAME%
卸载脚本:
@echo off
cd /d "%~dp0%"
echo 关闭后台服务中...
REM 停止和卸载名为 mysql_wcat、redis_cae 的服务
sc stop mysql_cae
sc delete mysql_cae
sc stop redis_cae
sc delete redis_cae
rem ***************删除jar、nginx、form对应的自启动服务***************
set JAR_SERVICE_NAME=CAE_StartJar_Service
set NGINX_35695_SERVICE_NAME=CAE_Nginx_35695_Service
set NGINX_35697_SERVICE_NAME=CAE_Nginx_35697_Service
echo 停止并删除已存在的服务...
:: 停止JAR服务(如果正在运行),并删除服务
net stop %JAR_SERVICE_NAME% 2>nul
if %ERRORLEVEL%==0 (
echo %JAR_SERVICE_NAME% 停止了.
)
sc query %JAR_SERVICE_NAME% >nul 2>&1
if %ERRORLEVEL%==0 (
echo 正在删除服务 %JAR_SERVICE_NAME%...
sc delete %JAR_SERVICE_NAME%
)
:: 停止Nginx 35695服务(如果正在运行),并删除服务
net stop %NGINX_35695_SERVICE_NAME% 2>nul
if %ERRORLEVEL%==0 (
echo %NGINX_35695_SERVICE_NAME% 停止了.
)
sc query %NGINX_35695_SERVICE_NAME% >nul 2>&1
if %ERRORLEVEL%==0 (
echo 正在删除服务 %NGINX_35695_SERVICE_NAME%...
sc delete %NGINX_35695_SERVICE_NAME%
)
:: 停止Nginx 35697服务(如果正在运行),并删除服务
net stop %NGINX_35697_SERVICE_NAME% 2>nul
if %ERRORLEVEL%==0 (
echo %NGINX_35697_SERVICE_NAME% 停止了.
)
sc query %NGINX_35697_SERVICE_NAME% >nul 2>&1
if %ERRORLEVEL%==0 (
echo 正在删除服务 %NGINX_35697_SERVICE_NAME%...
sc delete %NGINX_35697_SERVICE_NAME%
)
REM ***************关闭 Java 程序***************
taskkill /f /im javaw.exe /t
REM 关闭所有以 nginx 开头的进程
for /f "tokens=2" %%a in ('tasklist ^| findstr /i "nginx"') do taskkill /f /pid %%a
echo 所有后台服务已关闭
将bat脚本编译成exe可执行文件
用Quick Batch File Compiler工具打开bat脚本文件,在嵌入文件中设置图表和管理员权限,点击构建生成exe可执行文件
生成的部分可执行会被360报木马病毒的解决办法:
在360软件开放平台网站提交审核,也可在360弹出框右上角点击误报反馈
提交后,等一天左右,就不会再报病毒了。
将制作好的exe文件放到my_caePackFile目录。
制作安装包
文件--新建脚本:向导,安装提示填写信息和引入以上的文件和文件夹,最后保存为packConfig.nsi文件。
双击该文件即可生成安装包文件CAESetup.exe。