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:
- Compruebe la existencia de JRE / JDK.
- 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;