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

文章目录

  • 目录
  • 一、介绍
  • 二、准备工作
  • 三、innoSetup
  • 四、创建工作目录
  • 五、mysql
    • 1、mysql服务初始化脚本
    • 2、mysql服务停止与删除脚本
    • 3、配置文件
    • 4、数据库初始化
    • 5、填坑
  • 六、redis
    • 1、redis服务初始化脚本
    • 2、redis服务启动脚本
    • 3、redis服务停止与删除脚本
  • 七、jdk
  • 八、nginx
    • 1、启动nginx
    • 2、关闭nginx
    • 3、修改nginx配置
  • 九、项目jar包
    • 1、启动jar包应用
    • 2、停止jar包应用
  • 十、制作安装包
    • 1、用户协议
    • 2、编辑制作脚本
    • 3、制作
  • 十一、安装
  • 十二、测试安装结果
  • 十三、优化体验
    • 1、安装winsw
    • 2、编辑nginx脚本
    • 3、编辑项目jar包脚本
    • 4、重新安装并测试
  • 十四、填坑

目录

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第1张图片

一、介绍

本文档详细说明了如何使用innoSetup将springboot项目打包成一个windows系统安装包,且该安装包自包含mysql数据库、redis缓存、nginx。

使用该安装包安装的服务包含了mysql、redis、nginx、以及springboot接口服务。

以下教程仅适用innoSetup 6

二、准备工作

  • innoSetup
  • 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,目录如下所示

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第2张图片

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="",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

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

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第3张图片

在mysql的目录下新建目录sql,与bin目录同级,将导出的sql文件放在sql目录中。

编辑create.sql文件,在脚本最顶行加入以下建库语句

DROP DATABASE IF EXISTS `word_press`;
CREATE DATABASE word_press;
USE word_press;

5、填坑

  • 在配置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

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如下所示

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第4张图片

八、nginx

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

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

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

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第5张图片

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" (
        if "%%m" == "" (
            TASKKILL /PID %%l /F
        ) else (
            TASKKILL /PID %%m /F
        )
        break
    )
)

3、修改nginx配置

编辑nginx配置文件nginx.conf,在你项目所使用的server块中添加反向代理配置和静态资源配置

# 静态资源
location /files {
	# 图片路径
	root   /home/ubuntu/wp;
}

# 接口代理
location /cbtp_fda {
	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
        )
    )
)

目录结构如下所示

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第6张图片

十、制作安装包

1、用户协议

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

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第7张图片

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+nginx+redis+jar包打包成windows安装包_第8张图片

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

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第9张图片

十一、安装

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

使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第10张图片

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

  • 同意用于协议

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第11张图片

  • 安装

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第12张图片

  • 安装运行mysql

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第13张图片

  • 安装运行redis

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第14张图片

  • 安装运行nginx

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第15张图片

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

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第16张图片

  • redis

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第17张图片

  • nginx

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第18张图片

  • 项目接口

    我们调用一下项目接口

    使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包_第19张图片

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

十三、优化体验

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

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

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

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.
    

本文已同步更新至本人博客网站,是兄弟就来砍我
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/

你可能感兴趣的:(windows,spring,boot)