Проверьте, что Java присутствует перед установкой

Я создаю установщик Установки Inno для приложения банки. Что я хочу сделать, прямо сейчас должен проверить, присутствует ли 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;

Мои вопросы:

  • Действительно ли проверка является реестром достаточно, чтобы быть уверенной, что домашний dir Java будет в ПУТИ? (чтобы смочь выполнить "Java" в консоли)

  • Если старшая версия Java установлена, который введет реестр, существуют так или иначе, или я должен буду проверить на каждую возможную старшую версию?

  • У кого-либо есть лучший способ загрузить Java, чем просто показ всплывающего окна и взятие пользователей к странице загрузки?

19
задан Martin Prikryl 21 November 2016 в 14:32
поделиться

4 ответа

Я надеюсь, что кто-то сочтет это полезным. Я повторно использовал часть кода, размещенного в вики Inno Setups, для сравнения <> с версией в виде числа:

{ 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;

Спасибо всем за вашу помощь

13
ответ дан 30 November 2019 в 04:20
поделиться

Вместо проверки конкретной версии вы можете использовать

function RegKeyExists(const RootKey: Integer; const SubKeyName: String): Boolean;

для получения подключей HKLM \ SOFTWARE \ JavaSoft \ Java Runtime Environment . (Возможна ли параллельная установка разных версий? Не знаю ...) Вам нужно будет немного повозиться со строкой, чтобы проверить, установлена ​​ли версия 1.6 или выше, но это будет более гибко, чем проверка определенного номера версии.

0
ответ дан 30 November 2019 в 04:20
поделиться

По поводу вашего третьего вопроса см. здесь в разделе «Торговые марки и лицензирование». Резюме Exec: вы можете распространять JRE вместе со своим приложением. Я думаю, что некоторые приложения делают это, чтобы убедиться, что у них нет проблем с совместимостью версий, то есть устанавливают JRE в подпапку самого приложения.

Что касается PATH, почему это важно? Вы можете создать ярлык, который ссылается на java.exe по его полному пути для запуска вашего приложения. Важно ли, чтобы пользователь запускал программу из командной строки самостоятельно?

2
ответ дан 30 November 2019 в 04:20
поделиться

Я немного изменил ваш код, думаю, таким образом будут поддерживаться новые версии Java; -)

function InitializeSetup(): Boolean;
var
 ErrorCode: Integer;
 JavaInstalled : Boolean;
 Result1 : Boolean;
 Versions: TArrayOfString;
 I: Integer;
begin
 if RegGetSubkeyNames(HKLM, 'SOFTWARE\JavaSoft\Java Runtime Environment', Versions) then
 begin
  for I := 0 to GetArrayLength(Versions)-1 do
   if JavaInstalled = true then
   begin
    //do nothing
   end else
   begin
    if ( Versions[I][2]='.' ) and ( ( StrToInt(Versions[I][1]) > 1 ) or ( ( StrToInt(Versions[I][1]) = 1 ) and ( StrToInt(Versions[I][3]) >= 6 ) ) ) then
    begin
     JavaInstalled := true;
    end else
    begin
     JavaInstalled := false;
    end;
   end;
 end else
 begin
  JavaInstalled := false;
 end;


 //JavaInstalled := RegKeyExists(HKLM,'SOFTWARE\JavaSoft\Java Runtime Environment\1.9');
 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://www.java.com/getjava/',
    '','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
  end;
    end;
end;


end.
5
ответ дан 30 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: