0

インストーラーは jdk を使用してキーストアを生成しますkeytool。最近、jdk 7 にアップグレードして以来、32/64 ビットの統合、特に 64 ビット サーバーに 32 ビット バージョンをインストールしようとしたときに問題が発生しました (なぜこれを行っているのか聞かないでください。私はすでにその戦いに負けました)。 )。問題はkeytool、インストーラーから実行しようとすると、キーストアの生成に失敗し、エラーがスローされることです。

java.lang.InternalError: ここに来るべきではありません。

スタック トレースの最初の数行:

     at sun.nio.fs.WindowsNativeDispatcher.GetFinalPathNameByHandle(Native Method)
     at sun.nio.fs.WindowsLinkSupport.getFinalPath(WindowsLinkSupport.java:77)
     at sun.nio.fs.WindowsLinkSupport.getRealPath(WindowsLinkSupport.java:242)
     at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:836)
     at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:44)

この行の実行:

nsExec::ExecToLog '"$InstallationRoot\$ConfigName\jdk\bin\keytool.exe" -genkey -keystore "$InstallationRoot\$ConfigName\tomcat\tomcat.jks" -alias tomcat -keyalg RSA -validity 109500 -storepass password -keypass password -dname CN=$server,OU=Syseng,O=Company,L=City,ST=State,C=US'

変数はすべて有効で、インストーラ全体で使用されます。実行中の正確な行を出力しようとしDetailPrint、出力をコピーしてコマンドラインに貼り付けたところ、機能しました。

"C:\TempInstallDir\Inst1\jdk\bin\keytool.exe" -genkey -keystore "C:\TempInstallDir\Inst1\tomcat\tomcat.jks" -alias tomcat -keyalg RSA -validity 109500 -storepass password -keypass password -dname CN=SANDBOX,OU=Syseng,O=Company,L=City,ST=State,C=US
  • また、 と を使用してみExecましExecWaitnsExec
  • コマンドをバッチファイルに書き込んでkeytool、インストーラーから呼び出してみました。繰り返しになりますが、インストーラーからどのように呼び出されても同じ例外が発生しましたが、コマンドラインに移動して同じバッチファイルを実行しただけでは機能しました.
  • を使用して、32ビットコマンドプロンプトで強制的に実行しようとしました%WINDIR%\SysWOW64\cmd.exe /C

ここでは基本的にアイデアがありません-インストーラーで実行することで確実に失敗させ、コマンドラインからまったく同じコマンドを直接実行することで確実に機能させることができます。また、32 ビット サーバーから実行したり、64 ビット サーバーで 64 ビット インストーラーを実行したりしても問題なく動作します。

また、インストーラーを管理者として実行しています。そうしないと、失敗する他のステップがあります。これは、Windows Server 2008 R2 と Windows 7 の両方で発生しています。

誰もこれを見たことがありますか?その場合、回避策は何ですか (64 ビット インストールを使用する以外に)? 一方、実際に回避策がなく、64 ビットを使用する必要がある場合は、これを再び取り上げるための弾薬が少し増えます。

4

1 に答える 1

1

うーん、いろいろな理由が考えられます。デバッグせずに言うのは難しいです。いくつかのヒント:

  • 管理者 (昇格) / ユーザー (非昇格) モードでインストーラーを実行してみてください

  • 管理者(昇格)/ユーザー(非昇格)モードでCMD(コマンドライン)を実行してみてください

  • nsExec::ExecToLog を呼び出す前に作業ディレクトリを設定してみてください

  • SetShellVarContext current|all を設定してみてください

  • SetRegView 32|64|lastused を変更してみてください

私の最初の賭けは、NSIS から起動される cmd.exe (コマンド ライン) が、Windows から直接起動される cmd とは異なることです。

cmd を手動で (正常に) 実行すると、どのディレクトリから起動されますか? そして、それは 32 ビット プロセスですか (タスク マネージャーで確認できます - http://www.heckler.com.br/blog/2010/03/16/how-to-open-a-64bit-command-prompt-from- a-32bit-application/ ) または 64 ビット?

于 2013-06-27T09:06:38.487 に答える