使用NSIS在64位服务器上运行32位java keytool

时间:2013-06-26 15:38:49

标签: java 64-bit nsis

我们的安装程序使用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
  • 我还尝试使用ExecExecWait,以防nsExec出现奇怪之处。
  • 我尝试将keytool命令写入批处理文件,然后从安装程序调用该命令。同样,无论安装程序如何调用,都会产生相同的异常,但如果我只是去命令行并运行相同的批处理文件,那么它就可以了。
  • 我尝试使用%WINDIR%\SysWOW64\cmd.exe /C强制它在32位命令提示符下运行。

我基本上没有想法 - 我可以通过在安装程序中运行它来可靠地使它失败并通过直接从命令行运行完全相同的命令来可靠地使其工作。它也可以在32位服务器上运行,或者在64位服务器上运行64位安装程序。

另外,我正在以管理员身份运行安装程序;否则还有其他步骤会失败。这在Windows Server 2008 R2和Windows 7上都会发生。

有没有人见过这个?如果是这样,那么解决方法是什么(除了仅使用64位安装)?另一方面,如果确实没有解决方法而且我们必须使用64位,那么这会给我一点弹药再次提升它。

1 个答案:

答案 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位?