我们的安装程序使用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