Inno Setup - 设置Java环境变量

6

我正在使用Inno Setup为我的项目制作安装程序,我需要它设置Java环境变量,这样当他们运行cmd时就不会出现“找不到Java”等错误。

我已经找到一些与Inno Setup和设置环境变量相关的帖子,但是否有人知道这个特定实例的解决方案?


Java运行时安装程序不已经做了这个吗? - Deanna
2个回答

15

假设Java已安装在其默认位置 program files/Java,那么像这样的代码应该适用于您的情况:

[Registry]
; set PATH
Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName:"PATH"; ValueData:"{olddata};{pf}\Java\bin"; Flags: preservestringtype
; set JAVA_HOME
Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName:"JAVA_HOME"; ValueData:"{pf}\Java"; Flags: preservestringtype

[Setup]
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes

我不确定您想要设置哪个环境变量——PATH还是JAVA_HOME,所以我都添加了。

更改PATH通常不是必须的,因为Java安装程序倾向于将其自己添加到路径中;如果我没记错,它会将java.exe和javaw.exe复制到系统目录之一中。


3
不要忘记ChangesEnvironment指令。 - Deanna
请注意,每行代码的“Flags”部分之前缺少一个“;”。 - Michael Yakobi
谢谢@MichaelYakobi,已修复。 - Joni
您可以从注册表中查看安装目录,并使用脚本常量进行设置(请参见下面的我的答案)。 - Matthieu
这将仅为当前用户添加变量,而不是机器。您需要使用Root: HKLM; Subkey:“SYSTEM\CurrentControlSet\Control\Session Manager\Environment”来添加全局变量。 - vezenkov
显示剩余2条评论

2

除了@Joni的答案之外,您还可以从注册表中获取Java安装目录,并使用脚本常量来设置环境变量:

(编辑:感谢@TLama进行代码修正!)

[Registry]
Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName:"JAVA_HOME"; ValueData:"{code:GetJava32Path|6}"; Flags: preservestringtype

[Code]
const
  RegKeyJRE = 'SOFTWARE\JavaSoft\Java Runtime Environment\';

function GetJava32Path(MinVersion: string): string;
var
  I: Integer;
  Path: string;
  Versions: TArrayOfString;
begin
  Result := '';
  if RegGetSubkeyNames(HKLM, RegKeyJRE, Versions) then
    for I := 0 to GetArrayLength(Versions)-1 do
      if (Versions[I][2] = '.') and (Versions[I][3] >= MinVersion) and
        RegQueryStringValue(HKLM32, RegKeyJRE + Versions[I], 'JavaHome', Path) then
      begin
        Result := Path;
        Exit;
      end;
end;

(注:我远非Pascal脚本专家,代码可能有改进的空间,但现在已由@TLama进行了更正 :))
说明:这段话是一位作者对自己编写的Pascal脚本代码的评论。作者承认自己不是Pascal脚本专家,并且感谢@TLama对代码的纠正。

你的代码绝对正确(可以通过删除那些额外的begin..end块来缩短代码,可能有一个JRE注册表键路径的常量(DRY类型),并且可以使用and运算符删除一个if,函数返回可以是exit而不是break-所有这些都是次要的或者是美观上的问题)。 - TLama
@TLama 非常感谢,我已经复制了您的代码并学到了一些东西 :) - Matthieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接