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
  • 我也尝试使用Execand ExecWait,以防nsExec.
  • 我尝试将keytool命令写入批处理文件,然后从安装程序中调用它。同样,无论从安装程序如何调用,都会出现相同的异常,但如果我只是转到命令行并运行相同的批处理文件,它就可以工作。
  • 我尝试使用%WINDIR%\SysWOW64\cmd.exe /C.

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

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

有人见过这个吗?如果是这样,解决方法是什么(除了仅使用 64 位安装)?另一方面,如果真的没有解决方法,我们必须使用 64 位,那么这会给我更多的弹药来再次提出这个问题。

4

1 回答 1

1

嗯,可能有各种原因。不调试很难说。几个小贴士:

  • 尝试在管理员(提升)/用户(非提升)模式下运行安装程序

  • 尝试在管理员(提升)/用户(非提升)模式下运行 CMD(命令行)

  • 在调用 nsExec::ExecToLog 之前尝试设置工作目录

  • 尝试设置 SetShellVarContext 当前|全部

  • 尝试更改 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 回答