一尘不染

安装前检查Java是否存在

java

我正在为jar应用程序创建一个Inno Setup安装程序。我现在想做的是在继续安装之前检查Java是否存在。因此,我只需要确保用户将能够运行:

java -jar my-app.jar

我现在正在做的是:

[Code]

function InitializeSetup(): Boolean;
var
  ErrorCode: Integer;
  JavaInstalled : Boolean;
  Result1 : Boolean;
begin
  JavaInstalled := RegKeyExists(HKLM,'SOFTWARE\JavaSoft\Java Runtime Environment\1.6');
  if JavaInstalled then
  begin
    Result := true;
  end else
    begin
      Result1 := MsgBox('This tool requires Java Runtime Environment version 1.6 or newer to run. Please download and install the JRE and run this setup again. Do you want to download it now?',
        mbConfirmation, MB_YESNO) = idYes;
      if Result1 = false then
      begin
        Result:=false;
      end else
      begin
        Result:=false;
        ShellExec('open',
          'http://javadl.sun.com/webapps/download/AutoDL?BundleId=33787',
          '','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
      end;
    end;
  end;
end;

我的问题是:

  • 检查注册表是否足以确保Java的主目录位于PATH中?(以便能够在控制台中运行“ java”)

  • 如果安装了更高版本的Java,注册表中的键是否仍然存在,或者我将不得不检查每个更高版本?

  • 除了显示弹出窗口并将用户带到下载页面之外,还有谁有更好的方法来下载Java?


阅读 197

收藏
2020-12-03

共1个答案

一尘不染

我希望有人觉得这很有用,我所做的是重用了Inno Setups Wiki中放置的一些代码,以对该版本进行<>比较作为数字:

{ Both DecodeVersion and CompareVersion functions where taken from the  wiki }
procedure DecodeVersion (verstr: String; var verint: array of Integer);
var
  i,p: Integer; s: string;
begin
  { initialize array }
  verint := [0,0,0,0];
  i := 0;
  while ((Length(verstr) > 0) and (i < 4)) do
  begin
    p := pos ('.', verstr);
    if p > 0 then
    begin
      if p = 1 then s:= '0' else s:= Copy (verstr, 1, p - 1);
      verint[i] := StrToInt(s);
      i := i + 1;
      verstr := Copy (verstr, p+1, Length(verstr));
    end
    else
    begin
      verint[i] := StrToInt (verstr);
      verstr := '';
    end;
  end;

end;

function CompareVersion (ver1, ver2: String) : Integer;
var
  verint1, verint2: array of Integer;
  i: integer;
begin

  SetArrayLength (verint1, 4);
  DecodeVersion (ver1, verint1);

  SetArrayLength (verint2, 4);
  DecodeVersion (ver2, verint2);

  Result := 0; i := 0;
  while ((Result = 0) and ( i < 4 )) do
  begin
    if verint1[i] > verint2[i] then
      Result := 1
    else
      if verint1[i] < verint2[i] then
        Result := -1
      else
        Result := 0;
    i := i + 1;
  end;

end;

{ Here's my code }
function InitializeSetup(): Boolean;
var
  ErrorCode: Integer;
  JavaVer : String;
  Result1 : Boolean;
begin
    RegQueryStringValue(HKLM, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JavaVer);
    Result := false;
    if Length( JavaVer ) > 0 then
    begin
        if CompareVersion(JavaVer,'1.6') >= 0 then
        begin
            Result := true;
        end;
    end;
    if Result = false then
    begin
        Result1 := MsgBox('This tool requires Java Runtime Environment v1.6 or older to run. Please download and install JRE and run this setup again.' + #13 + #10 + 'Do you want to download it now?',
          mbConfirmation, MB_YESNO) = idYes;
        if Result1 = true then
        begin
            ShellExec('open',
              'http://www.java.com/en/download/manual.jsp#win',
              '','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
        end;
    end;
end;

感谢你的帮助

2020-12-03