目录
一、介绍
本文档详细说明了如何使用innoSetup将springboot项目打包成一个windows系统安装包,且该安装包自包含mysql数据库、redis缓存、nginx。
使用该安装包安装的服务包含了mysql、redis、nginx、以及springboot接口服务。
以下教程仅适用innoSetup 6
二、准备工作
- innoSetup
- winsw
- mysql8数据库,免安装版
- redis,windows版
- jdk8
- nginx,windows版
- 项目jar包
三、innoSetup
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
,目录中最好不要包括中文
五、mysql
本项目使用的是mysql8,因此以mysql8为例
免安装版下载地址:https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.30-winx64.zip
下载完成后将mysql解压到工作目录workspace
,目录如下所示
1、mysql服务初始化脚本
在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="<system>",VariableValue="%mysqlpath%"
rem 追加path变量
wmic ENVIRONMENT where "name='PATH' and username='<system>'" set VariableValue="%path%;%%MYSQL_HOME%%\bin;"
echo ----4. Mysql environment create/append success---->>/log.txt
)
exit
2、mysql服务停止与删除脚本
在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
3、配置文件
在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
4、数据库初始化
并将数据库的结构和数据导出为create.sql
文件
在mysql的目录下新建目录sql
,与bin
目录同级,将导出的sql文件放在sql
目录中。
编辑create.sql
文件,在脚本最顶行加入以下建库语句
DROP DATABASE IF EXISTS `word_press`;
CREATE DATABASE word_press;
USE word_press;
六、redis
redis官方没有提供windows版的服务,但是微软有个团队将redis维护成windows版本了,并且放在了github上
下载地址:https://github.com/microsoftarchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.zip
下载完成后,将redis解压到workspace
目录下
1、redis服务初始化脚本
在workspace
目录下新建init-redis.bat
创建redis服务,此时会在注册表中添加redis服务的相关配置
@echo off
redis-server --service-install redis.windows.conf --loglevel verbose
2、redis服务启动脚本
在workspace
目录下新建start-redis.bat
作为redis启动脚本
@echo off
net start redis
3、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
七、jdk
本项目使用java8,因此以java8为例
下载完成后安装jdk,安装完成后,将jdk1.8.0_281
目录复制到workspace
如下所示
八、nginx
如果你的项目没有使用nginx动静分离的特性,可以忽略nginx部分。
nginx下载地址:http://nginx.org/download/nginx-1.22.1.zip
将nginx解压到与jdk同级目录,如下图所示
1、启动nginx
进入nginx
目录,新建startNginx.bat
文件
# 启动ngin
start nginx.exe
pause
2、关闭nginx
进入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" (
TASKKILL /im nginx.exe /F
break
)
)
3、修改nginx配置
编辑nginx配置文件nginx.conf
,在你项目所使用的server块中添加反向代理配置和静态资源配置
# 静态资源
location /files {
# 图片路径
root /home/ubuntu/wp;
}
# 接口代理
location /wp {
proxy_pass http://localhost:8082/wp;
}
九、项目jar包
1、启动jar包应用
在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
2、停止jar包应用
新建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
)
)
)
目录结构如下所示
十、制作安装包
1、用户协议
在workspace
目录中新建文件license.rtf
,随便编辑一些内容如下:
2、编辑制作脚本
在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}"
3、制作
打开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
十二、测试安装结果
mysql
redis
nginx
项目接口
我们调用一下项目接口
至此,测试通过,我们制作的安装包可以说是通过了
十三、优化体验
从上面的测试结果来看,本地后端应用已经安装成功了,但是其中有缺点
- nginx和项目jar包是以命令的方式启动的,如果电脑关机重启了,那么nginx和项目jar包需要重新手动启动
- 卸载应用时,无法将整个安装目录删除,会有残留文件
因此,针对以上两个缺陷,做出如下改进
1、安装winsw
winsw全称windows-service-wrapper,是一个将应用注册为windows系统服务的工具。非常小巧方便,只有16M。
下载地址:https://github.com/winsw/winsw/releases/download/v2.11.0/WinSW-x64.exe
我们使用winsw将nginx和项目jar注册为系统服务,这样就可以实现电脑重启后应用自动启动的效果了,而且卸载完成后也不会有任何残留文件
2、编辑nginx脚本
进入nginx
目录,将下载的winsw
复制到当前目录,并重命名为nginx-service.exe,再新建文件nginx-service.xml
编辑nginx-service.xml,此文件内容的配置详情可参考https://github.com/winsw/winsw/blob/master/examples/sample-allOptions.xml
<service>
<!-- ID of the service. It should be unique across the Windows system-->
<id>nginx</id>
<!-- Display name of the service -->
<name>nginx</name>
<!-- Service description -->
<description>wordpress产品nginx服务</description>
<!-- Path to the executable, which should be started -->
<executable>%BASE%\nginx.exe</executable>
<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
3、编辑项目jar包脚本
进入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 of the service. It should be unique across the Windows system-->
<id>word-press</id>
<!-- Display name of the service -->
<name>word-press</name>
<!-- Service description -->
<description>wordpress产品后端接口服务</description>
<!-- Path to the executable, which should be started -->
<executable>C:\Program Files (x86)\word-press\project\jdk1.8.0_281\bin\javaw</executable>
<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
4、重新安装并测试
以上三步完成后,使用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.