SpringBoot项目打包(exe+jre+mysql)一键安装,吐血总结,实测可用
一、打包
- 1、将SpringBoot项目打包为jar包(数据库配置建议改为本地,因后续数据库安装在本地)
( 以下为pom文件)
<!--打包方式-->
<packaging>jar</packaging>
<!--构建插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.1 修改完成后,使用idea自带的打包工具打包,maven package,生成jar包;
1.2 该jar包可直接使用Java -jar 运行(jar包位于工程target目录下)。
二、下载exe4j工具
1. 准备一个新的文件夹将jar包和jre放到一起
2. exe4j将jar包打包为exe应用
2.1 百度找一个exe4j的注册码
2.2 Next选择第二个“JAR in EXE mode”
2.3 Next填写名称及生成位置
2.4 选择操作系统32位或者64位
2.5 左边选择第5步,配置启动参数,点击绿色的➕添加jar包,选则启动类
2.6 填写jre版本,配置jre位置
2.7 一路Next结束
eg.如果你不要数据库,此时就结束了,运行即可,随后在任务管理器可以看到你运行的程序,浏览器访问即可.
三、下载Info Setup编译器
3.1 准备一个包含所需数据库的mysql安装目录(这样安装后可直接使用初始化数据,不用导入sql)
3.2 编写mysql_init.bat脚本和mysql_stop.bat,将文件放到bin目录下
mysql_init.bat,使用txt编写时注意格式位ANSI编码
cd %~dp0
cd ..
del %cd%\my.ini
echo 删除完成
echo [mysqld]>> my.ini
echo # 设置3306端口>> my.ini
echo port=3306>> my.ini
echo # 设置mysql的安装目录>> my.ini
echo basedir=%cd%>> my.ini
echo # 设置mysql数据库的数据的存放目录>> my.ini
echo datadir=%cd%\data>> my.ini
echo # 允许最大连接数>> my.ini
echo max_connections=200>> my.ini
echo # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统>> my.ini
echo max_connect_errors=10>> my.ini
echo # 服务端使用的字符集默认为UTF8>> my.ini
echo character-set-server=utf8>> my.ini
echo # 创建新表时将使用的默认存储引擎>> my.ini
echo default-storage-engine=INNODB>> my.ini
echo [mysql]>> my.ini
echo # 设置mysql客户端默认字符集>> my.ini
echo default-character-set=utf8>> my.ini
echo [client]>> my.ini
echo # 设置mysql客户端连接服务端时默认使用的端口>> my.ini
echo port=3306>> my.ini
echo default-character-set=utf8>> my.ini
echo my.ini生成成功
set inipath=%cd%\my.ini
cd bin
"%cd%\mysqld.exe" -remove mysql
"%cd%\mysqld.exe" -install mysql --defaults-file="%inipath%"
"%cd%\mysqld.exe" --initialize-insecure --user=mysql --console
net start mysql
sc config mysql start=auto
net stop mysql
net start mysql
echo 安装完毕
mysql_stop.bat
cd %~dp0
net stop mysql
sc delete mysql-job
"%cd%\mysqld.exe" -remove mysql
echo mysql卸载完成
exit
3.3 打开Info Setup,选择第二个
3.4 一直下一步到选择exe,添加mysql和jre,弹框选择是,意思是包含所有文件
3.5 继续下一步直到选择文件输出路径
3.6 下一步,直到立即编译脚本,选择 否
3.7 修改脚本
原脚本
; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define MyAppName "我的程序"
#define MyAppVersion "1.5"
#define MyAppPublisher "我的公司"
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "myExe.exe"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID"。)
AppId={{4A78DE64-0E3F-4EA1-BCE1-7A01E66BC1FF}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
; 以下行取消注释,以在非管理安装模式下运行(仅为当前用户安装)。
;PrivilegesRequired=lowest
OutputDir=C:\Users\wkwyM\Desktop\test
OutputBaseFilename=mysetup
Compression=lzma
SolidCompression=yes
WizardStyle=modern
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Users\wkwyM\Desktop\test\myExe.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\wkwyM\Desktop\test\mysql-8.0.27-winx64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\wkwyM\Desktop\test\jre\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
3.8 修改后脚本
; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define MyAppName "我的程序"
#define MyAppVersion "1.5"
#define MyAppPublisher "我的公司"
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "myExe.exe"
#define MysqlName "mysql-8.0.27-winx64"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID"。)
AppId={{26838C49-A6E9-440C-9DA3-0DFA2352119C}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
; 以下行取消注释,以在非管理安装模式下运行(仅为当前用户安装)。
;PrivilegesRequired=lowest
OutputDir=C:\Users\wkwyM\Desktop\jarTest
OutputBaseFilename=线缆1.2
SetupIconFile=C:\Users\wkwyM\Desktop\jarTest\Tyrannosaurus rex.ico
Compression=lzma
SolidCompression=yes
WizardStyle=modern
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Users\wkwyM\Desktop\jarTest\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\wkwyM\Desktop\jarTest\jre\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\wkwyM\Desktop\jarTest\var\*"; DestDir: "c:\var"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\wkwyM\Desktop\jarTest\{#MysqlName}\*"; DestDir: "{app}\{#MysqlName}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MysqlName}\bin\mysql_init.bat";
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[UninstallRun]
Filename: "{app}\{#MysqlName}\bin\mysql_stop.bat";
[Code]
// 自定义函数,判断软件是否运行,参数为需要判断的软件的exe名称
function CheckSoftRun(strExeName: String): Boolean;
// 变量定义
var ErrorCode: Integer;
var bRes: Boolean;
var strFileContent: AnsiString;
var strTmpPath: String; // 临时目录
var strTmpFile: String; // 临时文件,保存查找软件数据结果
var strCmdFind: String; // 查找软件命令
var strCmdKill: String; // 终止软件命令
begin
strTmpPath := GetTempDir();
strTmpFile := Format('%sfindSoftRes.txt', [strTmpPath]);
strCmdFind := Format('/c tasklist /nh|find /c /i "%s" > "%s"', [strExeName, strTmpFile]);
strCmdKill := Format('/c taskkill /f /t /im %s', [strExeName]);
bRes := ShellExec('open', ExpandConstant('{cmd}'), strCmdFind, '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
if bRes then begin
bRes := LoadStringFromFile(strTmpFile, strFileContent);
strFileContent := Trim(strFileContent);
if bRes then begin
if StrToInt(strFileContent) > 0 then begin
if MsgBox(ExpandConstant('{cm:checkSoftTip}'), mbConfirmation, MB_OKCANCEL) = IDOK then begin
// 终止程序
ShellExec('open', ExpandConstant('{cmd}'), strCmdKill, '', SW_HIDE, ewNoWait, ErrorCode);
Result:= true;// 继续安装
end else begin
Result:= false;// 安装程序退出
Exit;
end;
end else begin
// 软件没在运行
Result:= true;
Exit;
end;
end;
end;
Result :=true;
end;
// 重复安装检测
function InitializeSetup():boolean;
var
MykeynotExist:boolean;
ResultCode: Integer;
uicmd: String;
begin
MykeynotExist:= true;
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{4A78DE64-0E3F-4EA1-BCE1-7A01E66BC1FF}_is1', 'UninstallString', uicmd) then
begin
MsgBox('{#MyAppName}已经安装,你确定要先卸载,再安装!', mbInformation, MB_OK)
MyKeynotExist:= false;
Exec(RemoveQuotes(uicmd), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;
Result:= MykeynotExist
end;
// 卸载时关闭软件
function InitializeUninstall(): Boolean;
begin
Result := CheckSoftRun('{#MyAppExeName}');
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usDone then
begin
//删除 {app} 文件夹及其中所有文件
DelTree(ExpandConstant('{app}'), True, True, True);
end;
end;
[CustomMessages]
chinesesimp.checkSoftTip=检测到软件正在运行!%n%n点击"确定"终止软件后继续操作,否则点击"取消"。
不同点:
其余的为自定义函数,建议直接使用,均为友好性提示
3.9 编译运行,等进度条完成后安装使用即可
3.10 安装完成后不要运行,一定要以管理员身份运行