You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Inno Setup打包MyProgram时Java安装包计入体积问题求助

解决Inno Setup打包JRE导致安装包体积暴涨的问题

嘿,刚看到你的问题,作为经常用Inno Setup做安装包的老玩家,我太懂这种原本小巧的安装包突然暴涨体积的郁闷了!咱们先把问题根源理清楚,再给你两个实用的解决方案。

问题根源

你在[Files]段里添加了JRE安装包,不管DestDir设成{tmp}还是其他路径,这个文件都会被打包进你的MyProgram安装程序里——{tmp}的作用只是让安装程序在完成后自动删除这个临时文件,但它依然会被包含在安装包中,这就是你的安装包从10MB涨到75MB的原因。

解决方案

方案一:将JRE安装包作为外部文件(无需打包进主程序)

这个方案适合你希望用户手动把JRE安装包和主程序安装包放在同一目录的场景,好处是主安装包体积保持10MB,且不需要联网。

修改代码步骤:

  1. 删掉[Files]段里的JRE安装包配置,因为我们不需要把它打包进去了:
    ; 删掉这一行:Source: "{#JavaInstaller}"; DestDir: "{tmp}";
    
  2. 修改[Run]段的路径,让安装程序直接调用同一目录下的JRE安装包,同时添加检查确保文件存在:
    [Run]
    Filename: "{src}\{#JavaInstaller}"; Parameters: "SPONSORS=0"; \
    StatusMsg: "Java Runtime Environment not installed on your system. Installing..."; \
    Check: ShouldInstallJava
    
  3. 在[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安装包并安装。

修改代码步骤:

  1. 直接删掉[Files]和[Run]段里的JRE相关配置。
  2. 在[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:37:26