2012-05-21 134 views
5

我正在使用Inno Setup为我正在开发的项目创建一个安装程序,并且我需要它来设置java环境变量,以便当它们运行cmd时它们不会获得java找不到错误,或类似的东西。Inno Setup - 设置Java环境变量

我发现了一些与Inno Setup和设置环境变量相关的其他帖子,但有人知道这个实例特有的东西吗?

+0

不Java运行安装程序已经做到这一点? – Deanna

回答

10

假设JRE安装在其默认位置程序文件/ 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安装程序倾向于将自己添加到路径; IIRC将java.exe和javaw.exe复制到其中一个系统目录。

+3

不要忘记ChangesEnvironment指令。 – Deanna

+0

@Deanna谢谢,我不知道那个!现在我可以删除从我们的安装程序重新启动的要求。 – Joni

+0

对不起,迟到的回复,但这是我正在寻找和完美工作的答案。 – Howes

2

加起来@乔尼的答案,你可以从注册表中的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; 

(NB我远远不是一个Pascal脚本专家,代码可能是好了很多,虽然现在它是由@TLama纠正:))

+0

你的代码是绝对正确的(可以通过删除那些额外的'begin..end'块来['shortened'](http://pastebin.com/bttNaCEG),JRE注册表键路径可能有一个常量( DRY类型),可以使用'和'运算符删除一个'if',并且从该函数返回可能是'exit'而不是'break' - 所有次要的或美化的东西)。 – TLama

+0

@TLama非常感谢,我已经粘贴了你的代码并学到了一些东西:) – Matthieu

+0

非常欢迎你! – TLama