我们的安装程序使用 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
andExecWait
,以防nsExec
. - 我尝试将
keytool
命令写入批处理文件,然后从安装程序中调用它。同样,无论从安装程序如何调用,都会出现相同的异常,但如果我只是转到命令行并运行相同的批处理文件,它就可以工作。 - 我尝试使用
%WINDIR%\SysWOW64\cmd.exe /C
.
我基本上没有想法 - 我可以通过在安装程序中运行它可靠地使其失败,并通过直接从命令行运行完全相同的命令可靠地使其工作。它也可以在 32 位服务器上运行或在 64 位服务器上运行 64 位安装程序。
另外,我以管理员身份运行安装程序;否则还有其他步骤会失败。这发生在 Windows Server 2008 R2 和 Windows 7 上。
有人见过这个吗?如果是这样,解决方法是什么(除了仅使用 64 位安装)?另一方面,如果真的没有解决方法,我们必须使用 64 位,那么这会给我更多的弹药来再次提出这个问题。