使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包

目录

目录.png

一、介绍

本文档详细说明了如何使用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,目录如下所示

mysql免安装版目录.png

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文件

将数据库导出到sql文件.png

在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为例

下载地址:https://download.oracle.com/otn/java/jdk/8u281-b09/89d678f2be164786b292527658ca1605/jdk-8u281-windows-x64.exe

下载完成后安装jdk,安装完成后,将jdk1.8.0_281目录复制到workspace如下所示

加入jdk后的目录.png

八、nginx

如果你的项目没有使用nginx动静分离的特性,可以忽略nginx部分。

nginx下载地址:http://nginx.org/download/nginx-1.22.1.zip

将nginx解压到与jdk同级目录,如下图所示

加入nginx后的目录.png

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
        )
    )
)

目录结构如下所示

加入jar包后的目录.png

十、制作安装包

1、用户协议

workspace目录中新建文件license.rtf,随便编辑一些内容如下:

用户协议内容.png

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}

生成APPID.png

然后点击绿色的运行按钮,innoSetup就开始为我们制作安装包了,制作完成后,安装包会自动保存到指定的目录中

生成APPID.png

十一、安装

进入我们设置的安装包输出目录

安装包输出目录.png

双击安装包,开始安装,在安装过程中,会自动将mysqlredisnginx、以及jar包安装并运行

  • 同意用于协议

    lecense.png

  • 安装

    安装界面.png

  • 安装运行mysql

    安装mysql命令行.png

  • 安装运行redis

    安装redis命令行.png

  • 安装运行nginx

    安装nginx命令行.png

  • 运行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

    mysql安装成功.png

  • redis

    redis安装成功.png

  • nginx

    nginx安装成功.png

  • 项目接口

    我们调用一下项目接口

    接口访问成功.png

至此,测试通过,我们制作的安装包可以说是通过了

十三、优化体验

从上面的测试结果来看,本地后端应用已经安装成功了,但是其中有缺点

  • 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

我们使用winswnginx项目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-jobredisnginx,以及word-press四个服务
  • 系统注册表中有mysql-jobredisnginx,以及word-press四个服务对应的文件夹

如果测试完成,再进行卸载,卸载后请检查以下几个地方

  • 系统服务中mysql-jobredisnginx,以及word-press四个服务被移除
  • 系统注册表中mysql-jobredisnginx,以及word-press四个服务对应的文件夹被移除

十四、填坑

在安装前,有以下几个注意事项

  • 系统服务列表中不能有重名的服务

  • 系统注册表中不能有与要安装的服务重名的文件夹

  • 系统环境变量中不能有MYSQL_HOMEPath变量中不能有mysql的配置

  • 在配置数据库的my.ini时,如果在mysql8的版本下配置了basedirdatadir,则在安装mysql服务时提示以下错误而导致安装失败,因为mysql8不允许我们指定basedirdatadir

    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实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Redis 数据安全/隐私保护
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
文章提供了Redis最流行的图形化界面工具Another Redis Desktop Manager的下载及使用教程,包括如何下载、解压、连接Redis服务器以及使用控制台和查看数据类型详细信息。
130 6
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
|
1月前
|
NoSQL Redis 数据库
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
文章提供了Redis图形化界面工具的下载及使用教程,包括如何连接本地Redis服务器、操作键值对、查看日志和使用命令行等功能。
121 0
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
|
1月前
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
887 1
|
1月前
|
NoSQL Redis 数据库
Redis Windows版下载,带安装包
文章提供了Windows版Redis的下载和安装指南,包括如何解压、启动Redis服务以及连接到Redis数据库。
531 0
Redis Windows版下载,带安装包
|
1月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
43 0
|
关系型数据库 MySQL 数据库
Windows安装MySQL
Windows安装MySQL
Windows安装MySQL
|
前端开发 关系型数据库 MySQL
手把手教你在Windows 11安装MySQL 8.0
1. 官网下载安装包 下载地址: dev.mysql.com/downloads/m… 通过下载页面可以选择安装包或者是压缩包。 这里选择安装文件(Installer MSI)
839 0
|
关系型数据库 MySQL Windows
|
关系型数据库 MySQL Windows
Windows 10下安装Mysql 5.7
mysql软件下载 mysql官方下载地址 01 02 03 04 mysql软件安装 05 06 07 08 09 10 ...
1021 0
|
存储 关系型数据库 MySQL
Windows 安装 MySQL 8.0.11
原文:Windows 安装 MySQL 8.0.11 下载并解压 从官方网站下载最新安装包 解压到目标安装目录 新建配置文件 在安装目录新建my.ini文件 添加如下内容(需修改为自己的配置) #------------------------------------------------ # my.
885 0