2009-08-19 6 views
18

Je crée un programme d'installation Inno Setup pour une application jar. Ce que je veux faire maintenant est de vérifier si java est présent avant de procéder à l'installation. Donc, je dois seulement être sûr que les utilisateurs seront en mesure d'exécuter:Vérifier que Java est présent avant l'installation

java -jar my-app.jar 

Ce que je fais en ce moment est:

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

Mes questions sont les suivantes:

  • Est vérifiant le registre assez pour être sûr que le home dir de java sera dans le PATH? (pour pouvoir exécuter "java" dans la console)

  • Si une version supérieure de Java est installée, cette clé dans le registre existera-t-elle quand même ou je devrai vérifier chaque version supérieure possible?

  • Quelqu'un a-t-il une meilleure façon de télécharger java que de simplement afficher un popup et amener les utilisateurs sur la page de téléchargement?

+2

Avez-vous l'intention d'exiger Sun Java, ou avez-vous l'intention d'autoriser une version (comme BEA-erm, Oracle-JRokit)? – atk

+0

Belle question. Je vais m'en tenir à Sun Java car mon outil est basé sur le support officiel et je ne veux pas avoir de problèmes futurs à cause des différentes implémentations java. – Santi

Répondre

13

J'espère que quelqu'un trouve cela utile, ce que je faisais réutilise une partie du code placé dans Inno wiki Setups faire un <> comparaison avec la version en nombre:

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

Merci à tous pour votre aider

+0

Votre script prend-il en charge l'installation du JRE/JDK également? De nombreux utilisateurs obtiennent Java, puis n'installent pas JDK. – YumYumYum

2

Pour votre troisième question, voir here, dans la section Marques et licences. Résumé Exec: vous pouvez distribuer le JRE avec votre application. Je pense que quelques applications font cela pour s'assurer qu'ils n'ont pas de problèmes de compatibilité de version - i.e installer le JRE dans un sous-dossier de l'application elle-même.

En ce qui concerne le PATH, pourquoi est-ce important? Vous pouvez créer un raccourci qui fait référence à java.exe par son chemin d'accès complet pour exécuter votre application. Est-il important que l'utilisateur démarre le programme via la ligne de commande?

+0

Je ne voudrais pas regrouper un JRE entier avec mon application, cela ajoute trop de poids à l'installateur et peut être inutile si les utilisateurs l'ont déjà. La deuxième suggestion semble bonne. On dirait que je peux trouver où obtenir le répertoire home java à partir du registre aussi ... – Santi

+0

avez-vous un lien vers la façon de faire le chemin complet de java.exe? – rogerdpack

0

Au lieu de vérifier pour une version spécifique, vous pouvez utiliser

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

pour obtenir les sous-clés de HKLM \ SOFTWARE \ JavaSoft \ Java Runtime Environment. (L'installation parallèle de différentes versions est-elle possible? Ne sais pas ...) Vous devrez faire quelques manipulations de chaînes pour vérifier si 1.6 ou supérieur est installé, mais ce serait plus flexible que de vérifier un numéro de version spécifique.

5

J'ai changé votre code un peu, je pense que cette façon les nouvelles versions de Java seront pris en charge ;-)

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

Plus amélioration de la alrea dy défini code:

  1. Vérifiez l'existence de JRE/JDK.
  2. Vérifiez dans la vue 32bit ou 64bit du registre.

code:

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

Vous avez ajouté la vue uniquement dans une racine de registre différente autant que je peux voir. En outre, vous avez copié le code avec toutes les erreurs qui y ont été faites ... – TLama

+0

Comme vous l'avez mentionné, j'ai ajouté la vérification dans les machines Win64 à la racine du registre _HKLM64_. Ce que vous n'avez pas remarqué, c'est que la vérification inclut maintenant le chemin _SOFTWARE \ JavaSoft \ Java Development Kit_. –

1

Une alternative simple aux réponses déjà proposées:

[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

Est-ce que cela vérifie la version spécifique de Java? Que faire si 1,5 a été trouvé? – Snake

2

Il y a une autre façon maintenant. Vous pouvez inclure un Stub setup - online installer, qui va télécharger et installer la configuration actuelle.
Le nom de fichier est pour l'instant JavaSetup8u121.exe, ce qui suggère qu'il pourrait s'agir d'une version spécifique. Je n'en ai pas un plus ancien pour tester s'il téléchargera une version plus ancienne ou spécifique.
Et pour l'instant, il semble qu'il ne fait qu'installer 32bit 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 

recherches pour 32 et 64 bits dans le registre, la fonction interne CompareStr() est en fait utilisable pour comparer les versions dans la chaîne, vous pouvez changer >= 0-=0 si vous voulez vérifier contre la version exacte et non « au moins '.

Vous pouvez également utiliser Exec() à la place de [Run], si vous souhaitez annuler l'installation complète au cas où l'utilisateur ne passerait pas par l'installation Java en l'annulant ou en raison d'une erreur.

Questions connexes