2009-08-19 14 views
18

Tworzę instalator Inno Setup dla aplikacji jar. To, co chcę teraz zrobić, to sprawdzić, czy Java jest obecna przed przystąpieniem do instalacji. Więc ja tylko muszą mieć pewność, że użytkownicy będą w stanie uruchomić:Sprawdź, czy Java jest obecna przed instalacją

java -jar my-app.jar 

Co robię teraz to:

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

moje pytania są następujące:

  • Czy sprawdzanie rejestru na tyle, aby upewnić się, że katalog domowy Java będzie w PATH? (aby móc uruchomić "java" w konsoli):

  • Jeśli jest zainstalowana wyższa wersja java, czy ten klucz w rejestrze istnieje, czy też będę musiał sprawdzić, czy jest dostępna wyższa wersja?

  • Czy ktoś ma lepszy sposób na pobranie java, niż po prostu pokazuje popup i przenosi użytkowników do strony pobierania?

+2

Czy masz zamiar wymagać Sun Java, czy zamierzasz zezwolić na dowolną wersję (np. BEA - erm, Oracle - JRokit)? – atk

+0

Ładne pytanie. Po prostu trzymam się Sun Java, ponieważ moje narzędzie jest oparte na oficjalnej pomocy technicznej i nie chcę mieć przyszłych problemów z powodu różnych implementacji języka Java. – Santi

Odpowiedz

13

Mam nadzieję, że ktoś znajdzie to użyteczne, co zrobiłem jest ponowne jakiś kawałek kodu umieszczonego w Inno Ustawienia wiki dokonania <> porównania z wersją jako numer:

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

Dzięki wszystkim za pomoc

+0

Czy Twój skrypt obsługuje także instalację JRE/JDK? Wielu użytkowników otrzymuje Javę, a nie instaluje JDK. – YumYumYum

2

Aby uzyskać trzecie pytanie, patrz here, w sekcji "Znak towarowy i licencjonowanie". Podsumowanie Exec: możesz dystrybuować środowisko JRE wraz z aplikacją. Myślę, że kilka aplikacji robi to, aby upewnić się, że nie mają problemów ze zgodnością wersji - tj. Zainstalować środowisko JRE w podfolderze samej aplikacji.

Jeśli chodzi o PATH, dlaczego tak ważne? Możesz utworzyć skrót odnoszący się do java.exe, używając pełnej ścieżki do uruchomienia aplikacji. Czy ważne jest, aby użytkownik uruchamiał program za pomocą wiersza poleceń?

+0

Nie chciałbym łączyć całego środowiska JRE z moją aplikacją, ponieważ zbyt wiele obciążenia przynosi instalatorowi i może być niepotrzebne, jeśli użytkownicy już go mają. Druga sugestia wygląda dobrze. Wygląda na to, że mogę znaleźć, gdzie można uzyskać katalog domowy Java z rejestru również ... – Santi

+0

Czy masz jakiś link do sposobu zrobić pełną ścieżkę do java.exe? – rogerdpack

0

Zamiast sprawdzania konkretnej wersji, można użyć

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

uzyskać podklucze HKLM \ SOFTWARE \ JavaSoft \ Java Runtime Environment. (Czy możliwa jest równoległa instalacja różnych wersji? Nie wiem ...) Trzeba by było zrobić kilka sznurków, aby sprawdzić, czy jest zainstalowany 1.6 lub wyższy, ale byłoby to bardziej elastyczne niż sprawdzanie konkretnego numeru wersji.

5

Zmieniłem kod trochę, myślę, że w ten sposób nowsze wersje Java będą obsługiwane ;-)

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. 
2

Więcej akcesorium dla alrea zdefiniowany kod:

  1. Sprawdź, czy istnieje JRE/JDK.
  2. Weryfikacja w rejestrze rejestru w wersji 32-bitowej lub 64-bitowej.

Kod:

function InitializeSetup(): Boolean; 
var 
ErrorCode: Integer; 
JavaInstalled : Boolean; 
ResultMsg : Boolean; 
Versions: TArrayOfString; 
I: Integer; 
regRoot: Integer; 
begin 
// Check which view of registry should be taken: 
regRoot := HKLM 
begin 
    if IsWin64 then 
    begin 
    regRoot := HKLM64 
    end; 
end; 
if (RegGetSubkeyNames(regRoot, 'SOFTWARE\JavaSoft\Java Runtime Environment', Versions)) or (RegGetSubkeyNames(regRoot, 'SOFTWARE\JavaSoft\Java Development Kit', 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]) >= 7))) then 
    begin 
    JavaInstalled := true; 
    end else 
    begin 
    JavaInstalled := false; 
    end; 
    end; 
end else 
begin 
    JavaInstalled := false; 
end; 

if JavaInstalled then 
begin 
    Result := true; 
end else 
    begin 
    ResultMsg := MsgBox('Oracle Java v1.7 or newer not found in the system. Java 1.7 or later is required to run this application (can be installed after this installation too). Do you want to continue?', 
    mbConfirmation, MB_YESNO) = idYes; 
    if ResultMsg = false then 
    begin 
    Result := false; 
    end else 
    begin 
    Result := true; 
    ShellExec('open', 
    'http://www.java.com/getjava/', 
    '','',SW_SHOWNORMAL,ewNoWait,ErrorCode); 
    end; 
    end; 
end; 

end. 
+1

Dodałeś tylko widok do innego katalogu głównego rejestru, o ile widzę. Poza tym skopiowałeś kod ze wszystkimi błędami tam wykonanymi ... – TLama

+0

Jak poprawnie wspomniałem, dodałem sprawdzanie w maszynach Win64 do katalogu głównego rejestru _HKLM64_. To, czego nie zauważyłeś, sprawdzenie obejmuje teraz również ścieżkę _SOFTWARE \ JavaSoft \ Java Development Kit_. –

1

Prosta alternatywa dla już zaproponowanych odpowiedzi:

[Code] 
function InitializeSetup(): boolean; 
var 
    ResultCode: integer; 
begin 
    if Exec('java', '-version', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin 
    Result := true;  
    end 
    else begin   
    if 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 then begin 
     Result := false; 
     ShellExec('open', 'https://java.com/download/', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode); 
    end; 
    end; 
end; 
+0

Czy to sprawdza konkretną wersję Java? Co jeśli znaleziono 1.5? – Snake

2

Jest też inny sposób teraz. Możesz dołączyć Stub setup - online installer, który pobierze i zainstaluje aktualną konfigurację.
Nazwa pliku na razie brzmi: JavaSetup8u121.exe, co sugeruje, że może to być wersja specyficzna. Nie mam starszej wersji, aby przetestować, czy pobierze aktualną lub konkretną, starszą wersję.
I na razie wygląda na to, że instaluje tylko 32-bitowe środowisko JRE.

[Files] 
#define JavaInstaller "JavaSetup8u121.exe" 
Source: "include\{#JavaInstaller}"; DestDir: "{tmp}"; 

[Code] 
const 
    REQUIRED_JAVA_VERSION = '1.7'; 

function isJavaInstalled(): Boolean; 
var 
    JavaVer : String; 
    tmpFileName, 
    pathJavaExe: String; 
    isGoodJavaVersion, 
    isFoundJavaPath: Boolean; 
    ResultCode: Integer; 
    ExecStdout: AnsiString; 
begin 

    { *** check in registry } 
    { sets variables: } 
    { JavaVer } 
    { isGoodJavaVersion } 
    if RegQueryStringValue(HKLM, 'SOFTWARE\JavaSoft\Java Runtime Environment', 
      'CurrentVersion', JavaVer) AND (JavaVer <> '') OR 
    RegQueryStringValue(HKLM64, 'SOFTWARE\JavaSoft\Java Runtime Environment', 
      'CurrentVersion', JavaVer) AND (JavaVer <> '') then begin 
    Log('* Java Entry in Registry present. Version: ' + JavaVer); 
    isGoodJavaVersion := CompareStr(JavaVer, REQUIRED_JAVA_VERSION) >= 0; 
    end; 

    { add additional checks, for example by searching the PATH, } 
    { or by running `java -version` } 

    Result := isGoodJavaVersion; 
end; 

[Run] 
Filename: "{tmp}\{#JavaInstaller}"; Parameters: "SPONSORS=0"; \ 
    StatusMsg: "Java Runtime Enviroment not installed on your system. Installing..."; \ 
    Check: not isJavaInstalled 

Wyszukiwania dla wersji 32 i 64 bit w rejestrze, wewnętrzna funkcja CompareStr() jest w rzeczywistości wykorzystywane do porównywania wersji w String, można zmienić >= 0 do =0 jeśli chcesz sprawdzić przed dokładnej wersji, a nie „co najmniej ".

Alternatywnie można użyć Exec() zamiast [Run], jeśli chcesz anulować całą instalację w przypadku, gdy użytkownik nie przejdzie przez instalację Java, anulując ją lub z powodu błędu.

Powiązane problemy