2009-08-19 18 views
18

Estoy creando un instalador Inno Setup para una aplicación jar. Lo que quiero hacer ahora es comprobar si java está presente antes de continuar con la instalación. Así que sólo necesito estar seguro de que los usuarios serán capaces de ejecutar:Comprobar si Java está presente antes de instalar

java -jar my-app.jar 

Lo que estoy haciendo en este momento es:

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

Mis preguntas son:

  • Es revisando el registro lo suficiente como para estar seguro de que el directorio de inicio de Java estará en la RUTA? (para poder ejecutar "java" en la consola)

  • Si hay una versión superior de java instalada, ¿esa clave en el registro existe de todos modos o tendré que verificar si es posible una versión más alta?

  • ¿Alguien tiene una forma mejor de descargar Java que simplemente mostrar una ventana emergente y llevar a los usuarios a la página de descarga?

+2

¿Pretende requerir Sun Java, o tiene la intención de permitir cualquier versión (como BEA-erm, Oracle-JRokit)? – atk

+0

Buena pregunta. Me limitaré a Sun Java ya que mi herramienta se basa en el soporte oficial y no quiero tener problemas futuros debido a las diferentes implementaciones de Java. – Santi

Respuesta

13

espero que alguien encuentre esto útil, lo que hice es la reutilización de alguna pieza del código que se coloca en Inno configuraciones wiki para hacer una <> comparación con la versión como un número:

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

Gracias todos por su ayudar a

+0

¿Admite la secuencia de comandos para instalar JRE/JDK también? Muchos usuarios obtienen Java y luego no instalan JDK. – YumYumYum

2

Para su tercera pregunta, vea here, en la sección de Marcas Registradas y Licencias. Resumen ejecutivo: puede distribuir el JRE junto con su aplicación. Creo que algunas aplicaciones hacen esto para garantizar que no tengan problemas de compatibilidad de versiones, es decir, que instalen el JRE en una subcarpeta de la aplicación.

En cuanto a estar en la RUTA, ¿por qué es eso tan importante? Puede crear un acceso directo que haga referencia a java.exe por su ruta completa para ejecutar su aplicación. ¿Es importante que el usuario inicie el programa a través de la línea de comando?

+0

No quisiera agrupar todo un JRE con mi aplicación, agrega demasiado peso al instalador y puede ser innecesario si los usuarios ya lo tienen. La segunda sugerencia parece buena. Parece que puedo encontrar dónde obtener el directorio de inicio de Java desde el registro también ... – Santi

+0

¿Tiene algún vínculo a cómo hacer la ruta completa a java.exe? – rogerdpack

0

En lugar de comprobar que existe una versión específica, puede utilizar

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

para conseguir las subclaves de HKLM \ SOFTWARE \ JavaSoft \ Java Runtime Environment. (¿Es posible la instalación paralela de diferentes versiones? No lo sé ...) Debería hacer algunos ajustes para ver si 1.6 o superior está instalado, pero sería más flexible que buscar un número de versión específico.

5

he cambiado su código un poco, creo que de esta manera las nuevas versiones de Java serán apoyados ;-)

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

Más de mejora para el alrea código definido dy:

  1. Compruebe la existencia de JRE/JDK.
  2. Verifique en la vista de registro de 32 bits o de 64 bits.

Código:

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

Has agregado solo ver en una raíz de registro diferente hasta donde puedo ver. Además, ha copiado el código con todos los errores cometidos allí ... – TLama

+0

Como lo mencionó correctamente, agregué el cheque en máquinas Win64 a la raíz de registro _HKLM64_. Lo que no ha notado es que el cheque ahora también incluye la ruta _SOFTWARE \ JavaSoft \ Java Development Kit_. –

1

Una alternativa sencilla a las respuestas ya propuestas:

[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

¿Esto comprueba la versión específica de Java? ¿Qué pasa si se encontró 1.5? – Snake

2

Hay otra manera ahora. Puede incluir un Stub setup - online installer, que descargará e instalará la configuración real.
El nombre del archivo en este momento es JavaSetup8u121.exe, lo que sugiere que podría ser específico de la versión. No tengo uno más viejo para probar si descargará una versión anterior o específica.
Y por ahora, parece que solo instala 32 bits 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 

Las búsquedas de 32 y 64 bits en el registro, función interna CompareStr() es realmente utilizable para la comparación de las versiones en cadena, puede cambiar >= 0 a =0 si desea comprobar en contra de la versión exacta y no 'al menos '.

Alternativamente Exec() podría usarse en lugar de , si desea cancelar toda la instalación en caso de que el usuario no realice la instalación de Java cancelando o debido a un error.

Cuestiones relacionadas