我們的安裝程序使用jdk keytool
生成密鑰庫。我們最近升級到了jdk 7,從那時起,它就出現了32/64位集成的問題,特別是試圖在64位服務器上安裝32位版本(不要問我們爲什麼要這樣做;我已經失去了這場戰鬥)。問題是,試圖從安裝程序運行keytool
時,它無法生成一個密鑰存儲,並引發了錯誤堆棧跟蹤使用NSIS在64位服務器上運行32位java keytool
java.lang.InternalError: Should not get here.
前幾行:
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
和ExecWait
,萬一有一些古怪與nsExec
。 - 我嘗試將
keytool
命令寫入批處理文件,然後從安裝程序調用該文件。再說一遍,無論安裝程序是如何調用的,它都會給出相同的異常,但如果我只是轉到命令行並運行相同的批處理文件,它就會起作用。 - 我試着用
%WINDIR%\SysWOW64\cmd.exe /C
強制它在32位命令提示符下運行。
我基本上的想法在這裏 - 我可以可靠地使其在安裝程序運行它失敗,並可靠地使其通過直接在命令行中運行相同的指令工作。它也可以在32位服務器上正常運行,或者在64位服務器上運行64位安裝程序。
另外,我以管理員身份運行安裝程序;否則還有其他步驟將失敗。這在Windows Server 2008 R2和Windows 7上都會發生。
有沒有人看到這個?如果是這樣,解決方法是什麼(除了使用64位安裝)?另一方面,如果真的沒有解決辦法,我們必須使用64位,那麼這會給我多一點彈藥來重新提高它。
最後一個提示:嘗試使用ExecShell來執行批處理文件,它應該調用Windows資源管理器,該文件夾完全按照(手動)加載文件。 – Slappy
你的第一個賭注是對的。儘管我以管理員身份運行安裝程序(右鍵單擊,以管理員身份運行),但NSIS卻沒有管理員權限啓動子進程。添加RequestExecutionLevel最高解決了這個問題。有趣的是,這個_僅僅發生在Windows 7/2008 R2上。我們的大多數服務器仍然是2008 R1,並且它在那裏工作,這就是爲什麼該問題從未出現過。謝謝。 – ChicagoRedSox