Inno Setup打包MyProgram时Java安装包计入体积问题求助
解决Inno Setup打包JRE导致安装包体积暴涨的问题
嘿,刚看到你的问题,作为经常用Inno Setup做安装包的老玩家,我太懂这种原本小巧的安装包突然暴涨体积的郁闷了!咱们先把问题根源理清楚,再给你两个实用的解决方案。
问题根源
你在[Files]段里添加了JRE安装包,不管DestDir设成{tmp}还是其他路径,这个文件都会被打包进你的MyProgram安装程序里——{tmp}的作用只是让安装程序在完成后自动删除这个临时文件,但它依然会被包含在安装包中,这就是你的安装包从10MB涨到75MB的原因。
解决方案
方案一:将JRE安装包作为外部文件(无需打包进主程序)
这个方案适合你希望用户手动把JRE安装包和主程序安装包放在同一目录的场景,好处是主安装包体积保持10MB,且不需要联网。
修改代码步骤:
- 删掉
[Files]段里的JRE安装包配置,因为我们不需要把它打包进去了:; 删掉这一行:Source: "{#JavaInstaller}"; DestDir: "{tmp}"; - 修改
[Run]段的路径,让安装程序直接调用同一目录下的JRE安装包,同时添加检查确保文件存在:[Run] Filename: "{src}\{#JavaInstaller}"; Parameters: "SPONSORS=0"; \ StatusMsg: "Java Runtime Environment not installed on your system. Installing..."; \ Check: ShouldInstallJava - 在
[Code]段里添加检查逻辑,避免用户没放JRE安装包时出错:[Code] const REQUIRED_JAVA_VERSION = '1.7'; function isJavaInstalled(): Boolean; var JavaVer : String; isGoodJavaVersion: Boolean; begin Result := False; isGoodJavaVersion := False; if (RegQueryStringValue(HKLM, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JavaVer) and (JavaVer <> '')) or (RegQueryStringValue(HKLM64, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JavaVer) and (JavaVer <> '')) then begin Log('* Java Entry in Registry present. Version: ' + JavaVer); isGoodJavaVersion := CompareStr(JavaVer, REQUIRED_JAVA_VERSION) >= 0; end; Result := isGoodJavaVersion; end; function ShouldInstallJava(): Boolean; var JrePath: String; begin Result := not isJavaInstalled; if Result then begin JrePath := ExpandConstant("{src}\{#JavaInstaller}"); if not FileExists(JrePath) then begin MsgBox('Java Runtime Environment 未安装,且未找到对应的安装文件。'#13#10'请将 ' + '{#JavaInstaller} ' + '放在本安装程序的同一目录下,再重试。', mbError, MB_OK); Result := False; WizardForm.Close; end; end; end;
方案二:自动下载JRE(完全不打包,体积最小)
如果允许用户联网,这个方案最省心——主安装包保持10MB,只有当检测到用户未安装Java时,才自动下载JRE安装包并安装。
修改代码步骤:
- 直接删掉
[Files]和[Run]段里的JRE相关配置。 - 在
[Code]段里添加下载和安装逻辑:[Code] const REQUIRED_JAVA_VERSION = '1.7'; const JRE_DOWNLOAD_URL = 'https://your-download-url.com/jre-8u151-windows-x64.exe'; // 替换成实际的JRE下载链接 #define JavaInstaller "jre-8u151-windows-x64.exe" function isJavaInstalled(): Boolean; var JavaVer : String; isGoodJavaVersion: Boolean; begin Result := False; isGoodJavaVersion := False; if (RegQueryStringValue(HKLM, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JavaVer) and (JavaVer <> '')) or (RegQueryStringValue(HKLM64, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JavaVer) and (JavaVer <> '')) then begin Log('* Java Entry in Registry present. Version: ' + JavaVer); isGoodJavaVersion := CompareStr(JavaVer, REQUIRED_JAVA_VERSION) >= 0; end; Result := isGoodJavaVersion; end; procedure CurStepChanged(CurStep: TSetupStep); var JrePath: String; ResultCode: Integer; begin if CurStep = ssInstall then begin if not isJavaInstalled then begin JrePath := ExpandConstant('{tmp}\{#JavaInstaller}'); // 更新安装状态提示 WizardForm.StatusLabel.Caption := '正在下载Java Runtime Environment...'; WizardForm.ProgressGauge.Style := npbstMarquee; // 下载JRE安装包 if not UrlDownloadToFile('', JRE_DOWNLOAD_URL, JrePath, 0, nil) then begin MsgBox('Java Runtime Environment 下载失败,请手动安装后重试。', mbError, MB_OK); Exit; end; // 安装JRE WizardForm.StatusLabel.Caption := '正在安装Java Runtime Environment...'; if not Exec(JrePath, 'SPONSORS=0', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin MsgBox('Java安装失败,错误代码:' + IntToStr(ResultCode), mbError, MB_OK); end; end; end; end;
额外小技巧
如果你确实需要把JRE打包进去(比如用户无法联网),可以用UPX等压缩工具对JRE安装包进行二次压缩,虽然JRE本身已经是压缩过的,但通常还能减小几MB的体积。
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

