varios setup script programas instalar inno downloads descargar con inno-setup registry java

inno setup - setup - Compruebe que Java está presente antes de instalar



inno setup version 5.5 9 (7)

Cambié un poco su código, creo que de esta manera se admitirán nuevas versiones de 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.

Estoy creando un instalador Inno Setup para una aplicación jar. Lo que quiero hacer ahora es verificar si Java está presente antes de continuar con la instalación. Así que solo necesito asegurarme de que los usuarios podrán ejecutar:

java -jar my-app.jar

Lo que estoy haciendo ahora 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 suficiente verificar el registro para asegurarse de que el directorio de inicio de java esté en la RUTA? (para poder ejecutar "java" en la consola)

  • Si se instala una versión superior de java, ¿existirá esa clave en el registro de todos modos o tendré que verificar cada versión superior posible?

  • ¿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?


En lugar de buscar una versión específica, puede usar

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

para obtener las subclaves de HKLM / SOFTWARE / JavaSoft / Java Runtime Environment . (¿Es posible la instalación paralela de diferentes versiones? No sé ...) Necesitaría hacer algunas trampas de cuerdas para verificar si está instalado 1.6 o superior, pero sería más flexible que verificar un número de versión específico.


Espero que a alguien le resulte útil, lo que hice es reutilizar parte del código colocado en la wiki de Inno Setups para hacer una comparación de <> 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 a todos por su ayuda


Hay otra manera ahora. Puede incluir una configuración Stub - instalador en línea , que descargará e instalará la configuración real.
El nombre de archivo como ahora es JavaSetup8u121.exe , lo que sugiere que podría ser específico de la versión. No tengo una versión anterior para probar si descargará una versión anterior o específica.
Y por ahora, parece que solo instala 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

Busca versiones de 32 y 64 bits en el registro, la función interna CompareStr() se puede usar para comparar versiones en String, puede cambiar >= 0 a =0 si desea verificar la versión exacta y no ''al menos''.

Alternativamente, se puede usar Exec() lugar de [Run] , si desea cancelar la instalación completa en caso de que el usuario no realice la instalación de Java al cancelarla o debido a un error.


Más mejora para el código ya definido:

  1. Compruebe la existencia de JRE / JDK.
  2. Verifique en la vista del 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.


Para su tercera pregunta, consulte here , en la sección Marcas comerciales y licencias. Resumen ejecutivo: puede distribuir el JRE junto con su aplicación. Creo que algunas aplicaciones hacen esto para asegurarse de que no tengan problemas de compatibilidad de versión, es decir, instalar el JRE en una subcarpeta de la aplicación en sí.

En cuanto a estar en el PATH, ¿por qué es 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 comandos?


Una alternativa simple 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;