我们的安装程序使用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
和ExecWait
,以防nsExec
出现奇怪之处。 keytool
命令写入批处理文件,然后从安装程序调用该命令。同样,无论安装程序如何调用,都会产生相同的异常,但如果我只是去命令行并运行相同的批处理文件,那么它就可以了。 %WINDIR%\SysWOW64\cmd.exe /C
强制它在32位命令提示符下运行。 我基本上没有想法 - 我可以通过在安装程序中运行它来可靠地使它失败并通过直接从命令行运行完全相同的命令来可靠地使其工作。它也可以在32位服务器上运行,或者在64位服务器上运行64位安装程序。
另外,我正在以管理员身份运行安装程序;否则还有其他步骤会失败。这在Windows Server 2008 R2和Windows 7上都会发生。
有没有人见过这个?如果是这样,那么解决方法是什么(除了仅使用64位安装)?另一方面,如果确实没有解决方法而且我们必须使用64位,那么这会给我一点弹药再次提升它。
答案 0 :(得分:1)
嗯,可能有各种原因。没有调试很难说。几点提示:
尝试以admin(提升)/用户(非提升)模式运行安装程序
尝试以admin(提升)/用户(非提升)模式运行CMD(命令行)
尝试在调用nsExec :: ExecToLog之前设置工作目录
尝试设置SetShellVarContext current | all
尝试更改SetRegView 32 | 64 | lastused
我的第一个赌注是从NSIS启动的cmd.exe(命令行)与直接从Windows启动的cmd不同。
当您手动(成功)运行cmd时,它是从哪个dir启动的?它是32位进程(可以在任务管理器中看到 - http://www.heckler.com.br/blog/2010/03/16/how-to-open-a-64bit-command-prompt-from-a-32bit-application/)还是64位?