本文档详细说明了如何使用innoSetup将springboot项目打包成一个windows系统安装包,且该安装包自包含mysql数据库、redis缓存、nginx。
使用该安装包安装的服务包含了mysql、redis、nginx、以及springboot接口服务。
以下教程仅适用innoSetup 6
innosetup是一个将应用程序制作成windows安装包的软件,特点是完全免费,但需要会使用一些windows的批处理命令(bat)
Inno Setup是Windows程序开发的免费安装程序。Inno Setup于1997年首次推出,如今在功能设置和稳定性方面可与许多商业安装程序媲美,甚至超过它们。
官网:https://jrsoftware.org/isinfo.php
innoSetup6 下载地址:https://mlaan2.home.xs4all.nl/ispack/innosetup-6.2.1.exe
下载完成后进行安装
随便找个位置,创建目录workspace
,目录中最好不要包括中文
本项目使用的是mysql8,因此以mysql8为例
免安装版下载地址:https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.30-winx64.zip
下载完成后将mysql解压到工作目录workspace
,目录如下所示
在mysql的bin
目录下新建mysql_init.bat
,此时会在注册表中添加redis服务的相关配置
@echo off
rem将工作路径切换到当前脚本所在目录
cd /d %~dp0
echo %cd%
rem开始安装mysql
echo ----1.start installing Mysql ---->>../log.txt
"%cd%\mysqld.exe" --initialize-insecure --user=mysql --console
cd ..
set "mysqlpath=%cd%">>../log.txt
cd bin
mysqld install mysql-job --defaults-file="%mysqlpath%\my.ini"
rem设置mysql开机自启
echo ----2. start Mysql service---- >>../log.txt
rem pause
net start mysql-job
sc config mysql-job start= auto
net stop mysql-job
net start mysql-job
rem设置mysql环境变量,并进行创建数据库初始化
echo ----3.setting Mysql environment ---->>../log.txt
cd ..
rem设置mysql数据库root账户的密码为123456
"%cd%\bin\mysqladmin" -u root password 123456
"%cd%\bin\mysql.exe" -uroot -p123456 < "%cd%\sql\create.sql"
echo %Path%
echo %Path%|find /i "%mysqlpath%" && set IsNull=true || set IsNull=false
echo %IsNull%
if not %IsNull%==true (
wmic ENVIRONMENT create name="MYSQL_HOME",username="",VariableValue="%mysqlpath%"
rem 追加path变量
wmic ENVIRONMENT where "name='PATH' and username=''" set VariableValue="%path%;%%MYSQL_HOME%%\bin;"
echo ----4. Mysql environment create/append success---->>/log.txt
)
exit
在mysql的bin
目录下新建mysql_stop.bat
,在卸载应用时会执行此文件将注册表中的mysql配置一起删除
@echo off
cd /d %~dp0
echo ----1.[Mysql] start uninstalling Mysql ---->>../log.txt
sc stop mysql-job
sc delete mysql-job
echo ----2. [Mysql] uninstall finished---- >>../log.txt
exit
在mysql的目录下新建my.ini
,与bin
目录同级
[mysqld]
# mysql8遵循约定大于配置,basedir和datadir的配置交给mysql,否则mysql安装失败,
# 如果使用的是较低版本,则需要指定basedir和datadir的配置
# basedir ="C:\Program Files (x86)\mysql-8.0.30-winx64"
# datadir ="C:\Program Files (x86)\mysql-8.0.30-winx64\data"
port=3306
server_id =10
character-set-server=gbk
character_set_filesystem=gbk
max_allowed_packet=41942040
[client]
port=3306
default-character-set=gbk
[mysqld_safe]
timezone="UTC"
[mysql]
default-character-set=utf8mb4
并将数据库的结构和数据导出为create.sql
文件
在mysql的目录下新建目录sql
,与bin
目录同级,将导出的sql文件放在sql
目录中。
编辑create.sql
文件,在脚本最顶行加入以下建库语句
DROP DATABASE IF EXISTS `word_press`;
CREATE DATABASE word_press;
USE word_press;
在配置my.ini
时,如果在mysql8的版本下配置了basedir和datadir,则在安装mysql服务时提示以下错误而导致安装失败
mysqld: Can't create directory 'C:\Program Files\MySQL\Data\' (OS errno 2 - No such file or directory)
2018-09-19T06:45:53.339286Z 0 [System] [MY-013169] [Server] D:\Users\###\mysql-8.0.12-winx64\bin\mysqld.exe (mysqld 8.0.12) initializing of server in progress as process 3040
2018-09-19T06:45:53.339401Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file 'C:\Program Files\MySQL\share\errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2018-09-19T06:45:53.390068Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-09-19T06:45:53.398536Z 0 [System] [MY-010910] [Server] D:\Users\###\mysql-8.0.12-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.12) MySQL Community Server - GPL.
redis官方没有提供windows版的服务,但是微软有个团队将redis维护成windows版本了,并且放在了github上
下载地址:https://github.com/microsoftarchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.zip
下载完成后,将redis解压到workspace
目录下
在workspace
目录下新建init-redis.bat
创建redis服务,此时会在注册表中添加redis服务的相关配置
@echo off
redis-server --service-install redis.windows.conf --loglevel verbose
在workspace
目录下新建start-redis.bat
作为redis启动脚本
@echo off
net start redis
在redis
目录下新建stop-redis.bat
删除redis服务,在卸载应用时会将注册表中的redis配置一起删除
@echo off
cd /d %~dp0
echo ----1.[Redis] start uninstalling Redis ---->>../log.txt
sc stop Redis
sc delete Redis
echo ----2. [Redis] uninstall finished---- >>../log.txt
exit
本项目使用java8,因此以java8为例
下载地址:https://download.oracle.com/otn/java/jdk/8u281-b09/89d678f2be164786b292527658ca1605/jdk-8u281-windows-x64.exe
下载完成后安装jdk,安装完成后,将jdk1.8.0_281
目录复制到workspace
如下所示
如果你的项目没有使用nginx动静分离的特性,可以忽略nginx部分。
nginx下载地址:http://nginx.org/download/nginx-1.22.1.zip
将nginx解压到与jdk同级目录,如下图所示
进入nginx
目录,新建startNginx.bat
文件
# 启动ngin
start nginx.exe
pause
进入nginx
目录,新建stopNginx.bat
文件,在卸载应用时会执行此文件关闭nginx进程
@echo off
set port=80
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo %%i %%j %%k %%l %%m
if "%%j" == "0.0.0.0:80" (
if "%%m" == "" (
TASKKILL /PID %%l /F
) else (
TASKKILL /PID %%m /F
)
break
)
)
编辑nginx配置文件nginx.conf
,在你项目所使用的server块中添加反向代理配置和静态资源配置
# 静态资源
location /files {
# 图片路径
root /home/ubuntu/wp;
}
# 接口代理
location /cbtp_fda {
proxy_pass http://localhost:8082/wp;
}
在workspace
目录下,将springboot项目打包好的jar包放在workspace
目录下,在同级目录下新建文件start.bat
,
注:使用javaw
而不是java
是因为使用javaw
可以不打开命令行界面直接后台启动jar包
@echo off
start .\jdk1.8.0_281\bin\javaw -jar cbt-fda-server.jar
exit
新建stop.bat
,在卸载应用时会执行此文件杀掉springboot应用进程
@echo off
set port=8082
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo %%i %%j %%k %%l %%m
if "%%j" == "0.0.0.0:8082" (
if "%%m" == "" (
TASKKILL /PID %%l /F
) else (
TASKKILL /PID %%m /F
)
)
)
目录结构如下所示
在workspace
目录中新建文件license.rtf
,随便编辑一些内容如下:
在workspace
目录中新建文件inno.iss
,编辑文件内容:
[Setup]
; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define MyAppName "word_press"
#define MyAppVersion "1.0"
#define MyAppPublisher "大不点"
#define MyAppURL "http://www.zhangks.top:8090/"
#define MyAppExeName "wordPress.exe"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,在innoSetup中点击 工具|在IDE中生成GUID。)
AppId={{FCFF80A1-0F19-4EC7-8C45-C1C54300D5EE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
# 禁止用户自定义安装目录,避免用户安装在C盘以外的盘,否则mysql会安装失败
DisableDirPage=yes
# 制作好的安装包所在的目录
OutputDir=E:\innosetup\output
OutputBaseFilename=wordPress
Compression=lzma
SolidCompression=yes
# 用户协议位置
LicenseFile=E:\innosetup\workspace\license.rtf
;AlwaysRestart=yes
;PrivilegesRequired=admin
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "E:\innosetup\workspace\mysql\*"; DestDir: "{app}\mysql"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "E:\innosetup\workspace\project\*"; DestDir: "{app}\project"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
[Icons]
; Name: "{commondesktop}\project";Filename: "{app}\project\start.exe"; WorkingDir: "{app}\HSDServer"
[INI]
;修改数据库配置文件
Filename:"{app}\mysql\my.ini";Section:"mysqld";Key:"basedir"; String:"{app}\mysql"
Filename:"{app}\mysql\my.ini";Section:"mysqld";Key:"datadir"; String:"{app}\mysql\data"
Filename:"{app}\mysql\my.ini";Section:"mysqld";Key:"port"; String:"3306"
Filename:"{app}\mysql\my.ini";Section:"client";Key:"port"; String:"3306"
[Run]
# 以下文件为mysql、nginx、redis、jar包四个组件启动的文件路径,
Filename: "{app}\mysql\bin\mysql_init.bat";
Filename: "{app}\project\nginx\startNginx.bat";
Filename: "{app}\project\redis\init-redis.bat";
Filename: "{app}\project\redis\start-redis.bat";
Filename: "{app}\project\start.bat";
[UninstallRun]
# 卸载应用时执行以下文件
Filename: "{app}\mysql\bin\mysql_stop.bat";
Filename: "{app}\project\redis\stop-redis.bat";
Filename: "{app}\project\nginx\stopNginx.bat";
Filename: "{app}\project\stop.bat";
[UninstallDelete]
Type:filesandordirs;Name:"{app}"
打开innoSetup软件,打开刚刚编辑的inno.iss
文件,将AppId={{FCFF80A1-0F19-4EC7-8C45-C1C54300D5EE}
用新的编号代替
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,在innoSetup中点击 工具|在IDE中生成GUID。)
AppId={{FCFF80A1-0F19-4EC7-8C45-C1C54300D5EE}
然后点击绿色的运行按钮,innoSetup就开始为我们制作安装包了,制作完成后,安装包会自动保存到指定的目录中
进入我们设置的安装包输出目录
双击安装包,开始安装,在安装过程中,会自动将mysql、redis、nginx、以及jar包安装并运行
同意用于协议
安装
安装运行mysql
安装运行redis
安装运行nginx
运行jar包
jar包的运行是通过javaw -jar
命令执行的,该命令不同于java -jar
命令的是javaw -jar
可以使jar包在不打开命令行界面的情况下后台运行,我们可以通过windows命令查看jar包是否已启动
C:\Users\GuoBa>netstat -ano | findstr 端口号
TCP 0.0.0.0:8082 0.0.0.0:0 LISTENING 20168
TCP [::]:8082 [::]:0 LISTENING 20168
至此,测试通过,我们制作的安装包可以说是通过了
从上面的测试结果来看,本地后端应用已经安装成功了,但是其中有缺点
因此,针对以上两个缺陷,做出如下改进
winsw全称windows-service-wrapper,是一个将应用注册为windows系统服务的工具。非常小巧方便,只有16M。
下载地址:https://github.com/winsw/winsw/releases/download/v2.11.0/WinSW-x64.exe
我们使用winsw将nginx和项目jar注册为系统服务,这样就可以实现电脑重启后应用自动启动的效果了,而且卸载完成后也不会有任何残留文件
进入nginx
目录,将下载的winsw
复制到当前目录,并重命名为nginx-service.exe,再新建文件nginx-service.xml
编辑nginx-service.xml,此文件内容的配置详情可参考https://github.com/winsw/winsw/blob/master/examples/sample-allOptions.xml
<service>
<id>nginxid>
<name>nginxname>
<description>wordpress产品nginx服务description>
<executable>%BASE%\nginx.exeexecutable>
<log mode="none">log>
service>
编辑startNginx.bat
# nginx-service.exe读取nginx-service.xml配置,安装nginx服务,
nginx-service.exe install
# 启动nginx服务
net start nginx
# 设置nginx开机自启动
sc config nginx start=auto
编辑stopNginx.bat
# 停止nginx服务
net stop nginx
# 卸载nginx服务
nginx-service.exe uninstall
进入project
目录,将下载的winsw
复制到当前目录,并重命名为word-press-service.exe,再新建文件word-press-service.xml
编辑word-press-service.xml,此文件内容的配置详情可参考https://github.com/winsw/winsw/blob/master/examples/sample-allOptions.xml
<service>
<id>word-pressid>
<name>word-pressname>
<description>wordpress产品后端接口服务description>
<executable>C:\Program Files (x86)\word-press\project\jdk1.8.0_281\bin\javawexecutable>
<arguments>-jar "%BASE%\word-press-server.jar"arguments>
<log mode="none">log>
service>
编辑start.bat
# word-press-service.word-press-service.xml配置,安装word-press服务,
word-press-service.exe install
# 启动word-press服务
net start word-press
# 设置word-press开机自启动
sc config word-press start=auto
编辑stop.bat
net stop cbtp
cbtp-service.exe uninstall
以上三步完成后,使用innoSetup
重新打包并安装,并对安装的服务进行测试。
安装完成后,请检查以下几个地方
mysql-job
,redis
,nginx
,以及word-press
四个服务mysql-job
,redis
,nginx
,以及word-press
四个服务对应的文件夹如果测试完成,再进行卸载,卸载后请检查以下几个地方
mysql-job
,redis
,nginx
,以及word-press
四个服务被移除mysql-job
,redis
,nginx
,以及word-press
四个服务对应的文件夹被移除在安装前,有以下几个注意事项
系统服务列表中不能有重名的服务
系统注册表中不能有与要安装的服务重名的文件夹
系统环境变量中不能有MYSQL_HOME
,Path变量中不能有mysql的配置
在配置数据库的my.ini
时,如果在mysql8的版本下配置了basedir
和datadir
,则在安装mysql服务时提示以下错误而导致安装失败,因为mysql8不允许我们指定basedir
和datadir
mysqld: Can't create directory 'C:\Program Files\MySQL\Data\' (OS errno 2 - No such file or directory)
2018-09-19T06:45:53.339286Z 0 [System] [MY-013169] [Server] D:\Users\###\mysql-8.0.12-winx64\bin\mysqld.exe (mysqld 8.0.12) initializing of server in progress as process 3040
2018-09-19T06:45:53.339401Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file 'C:\Program Files\MySQL\share\errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2018-09-19T06:45:53.390068Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-09-19T06:45:53.398536Z 0 [System] [MY-010910] [Server] D:\Users\###\mysql-8.0.12-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.12) MySQL Community Server - GPL.
本文已同步更新至本人博客网站,是兄弟就来砍我
http://www.zhangks.top:8090/2022/11/07/%e4%bd%bf%e7%94%a8innosetup%e5%b0%86mysqlnginxredisjar%e5%8c%85%e6%89%93%e5%8c%85%e6%88%90windows%e5%ae%89%e8%a3%85%e5%8c%85/