使用InnoSetUp打包Springboot开发项目
项目需求:BS项目能够一键安装在没有配置环境下运行。
考虑使用exe4j将Springboot开发的jar包和jre环境进行打包成exe,之后再通过InnoSetUp打包。
准备jar包及jre文件夹
使用exe4j-jar包生成exe
填写基本信息程序名以及输出程序的路径
程序基本配置,因为这里是一个Springboot程序没有图形界面所以选择输出类型Console application
选择jar包和项目主入口
选择jre,防止安装电脑上没有jre环境,使用自定义jre进行运行,提供jre
一直finish到结尾
查看exe是否可以正常运行
Inno SetUp脚本
遇到的坑
注意jre的目录,Source中如果在界面配置时没有选择子目录会出现问题,如果是在子目录下应为DestDir: "{app}\jre";
在注册表中配置开机自启,但是SOFTWARE\Microsoft\Windows\CurrentVersion\Run下没找到配置的key,是因为32位程序会在\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run下
; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "程序名" #define MyAppVersion "版本" #define MyAppPublisher "发布者信息" #define MyAppURL "发布者信息网址" #define MyAppExeName "执行程序.exe" #define MyAppAssocName MyAppName + " File" #define MyAppAssocExt ".myp" #define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt [Setup] ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId=自动生成 AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={autopf}\{#MyAppName} ChangesAssociations=yes DisableProgramGroupPage=yes ; Uncomment the following line to run in non administrative install mode (install for current user only.) ;PrivilegesRequired=lowest OutputDir=输出文件夹 Compression=lzma SolidCompression=yes WizardStyle=modern ShowLanguageDialog=yes [Languages] ;下载ChineseSimplified.isl,放在Inno SetUp languages文件夹下=下载地址https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation Name: "cs"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" Name: "english"; MessagesFile: "compiler:Default.isl" [Components] Name: main;Description:"主程序(必选)";Types:full compact custom;Flags:fixed Name: data;Description:"数据文件";Types:full Name: helpo;Description:"帮助文件";Types:full [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] ;Source: "D:\workstation\exe4j打包目录\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion;Components:main Source: "D:\workstation\exe4j打包目录\需要的文件.exe"; DestDir: "{app}"; Flags: ignoreversion;Components:main Source: "D:\workstation\exe4j打包目录\需要的文件.jar"; DestDir: "{app}"; Flags: ignoreversion;Components:main Source: "D:\workstation\exe4j打包目录\jre\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs; Components:main Source: "D:\workstation\exe4j打包目录\readme.txt"; DestDir: "{app}"; Flags: isreadme ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Registry] ;HKCR(HKEY_CLASSES_ROOT) ;HKCU(HKEY_CURRENT_USER) ;HKLM(HKEY_LOCAL_MACHINE) ;HKU(HKEY_USERS) ;HKCC(HKEY_CURRENT_CONFIG) Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0" Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1""" Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: "" ;Root: HKLM;Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Run;ValueType: string; ValueName:想在注册表中的名称;ValueData:{app}\{#MyAppExeName}.exe;Flags: uninsdeletevalue ;\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run ;wow https://blog.csdn.net/yandede/article/details/12711739 Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "想在注册表中的名称"; ValueData: "{app}\{#MyAppExeName}" [Icons] Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [dirs] Name:"{app}\帮助文件";Components:helpo [Messages] BeveledLabel=安装界面中左下角显示名称 [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent runhidden复制代码
但是以上配置会出现个问题,每次运行的时候都会出现命令行窗口运行,并且关闭后服务就停止运行了,这不是想要的结果。本来想通过vbs解决后台运行的问题。但是64bit电脑运行32bit的vbs一直没解决。双击运行可以,但是通过InnoSetUp启动时会出现错误。因此考虑还是使用Windows服务的方式实现。下一张将记录Windows服务配置方式。
还是附上vbs后台运行exe的脚本,路径支持相对路径
Set WS=CreateObject("WScript.Shell") WS.Run "需要的文件.exe",0
作者:好听麻薯
链接:https://juejin.cn/post/7023212428242452517