我正在使用Inno Setup为我的项目制作安装程序,我需要它设置Java环境变量,这样当他们运行cmd时就不会出现“找不到Java”等错误。
我已经找到一些与Inno Setup和设置环境变量相关的帖子,但是否有人知道这个特定实例的解决方案?
我正在使用Inno Setup为我的项目制作安装程序,我需要它设置Java环境变量,这样当他们运行cmd时就不会出现“找不到Java”等错误。
我已经找到一些与Inno Setup和设置环境变量相关的帖子,但是否有人知道这个特定实例的解决方案?
假设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复制到系统目录之一中。
除了@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;
begin..end
块来缩短代码,可能有一个JRE注册表键路径的常量(DRY类型),并且可以使用and
运算符删除一个if
,函数返回可以是exit
而不是break
-所有这些都是次要的或者是美观上的问题)。 - TLama