19

jar アプリ用の Inno Setup インストーラーを作成しています。今やりたいことは、インストールを進める前に Java が存在するかどうかを確認することです。したがって、ユーザーが実行できることを確認するだけで済みます。

java -jar my-app.jar

私が今していることは次のとおりです。

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

私の質問は次のとおりです。

  • JavaのホームディレクトリがPATHにあることを確認するのに十分なレジストリをチェックしていますか? (コンソールで「Java」を実行できるようにするため)

  • より高いバージョンの Java がインストールされている場合、レジストリ内のそのキーはとにかく存在しますか、それとも可能な限り高いバージョンごとに確認する必要がありますか?

  • ポップアップを表示してユーザーをダウンロードページに誘導するよりも、Javaをダウンロードするためのより良い方法はありますか?

4

8 に答える 8

14

誰かがこれを役に立てば幸いです。私が行ったことは、Inno Setups wiki に配置されたコードの一部を再利用して、バージョンを数値として < > 比較することです。

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

ご協力ありがとうございます

于 2009-08-20T15:25:35.320 に答える
5

私はあなたのコードを少し変更しました、私はこの方法で新しいバージョンの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.
于 2009-11-29T02:13:57.083 に答える
2

すでに定義されているコードのさらなる機能強化:

  1. JRE / JDK の存在を確認します。
  2. レジストリの 32 ビットまたは 64 ビット ビューで確認します。

コード:

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.
于 2014-06-22T04:28:56.280 に答える
2

すでに提案されている回答の簡単な代替案:

[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;
于 2015-10-15T20:34:58.347 に答える
2

3 番目の質問については、こちらの [商標とライセンス] セクションを参照してください。実行の要約: アプリと一緒に JRE を配布できます。いくつかのアプリは、バージョンの互換性の問題がないことを確認するためにこれを行うと思います。つまり、アプリ自体のサブフォルダーに JRE をインストールします。

PATH にある限り、なぜそれが重要なのですか? フルパスで java.exe を参照するショートカットを作成して、アプリを実行できます。ユーザーがコマンドラインからプログラムを起動することは重要ですか?

于 2009-08-19T04:25:20.170 に答える
0

特定のバージョンを確認する代わりに、使用できます

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

HKLM\SOFTWARE\JavaSoft\Java Runtime Environmentのサブキーを取得します。(異なるバージョンの並行インストールは可能ですか? わかりません...) 1.6 以降がインストールされているかどうかを確認するには、文字列をいじる必要がありますが、特定のバージョン番号を確認するよりも柔軟です。

于 2009-08-19T20:41:08.737 に答える