gpt4 book ai didi

java - 如何在使用 WiX Toolset(MSI 安装程序)卸载期间停止服务?

转载 作者:行者123 更新时间:2023-12-01 11:04:09 28 4
gpt4 key购买 nike

我正在使用 WiX Toolset 创建 MSI 安装程序。这将安装一个 Java 应用程序,该应用程序具有作为服务安装的 native 包装器。

我已经安装得很好,但是当我尝试卸载它时,重新启动管理器会检测到正在使用的文件并显示一个对话框,提示需要重新启动。

Windows 服务运行 native 包装器 bin\wrapper-windows-x86-64.exe。其组件配置是:

    <DirectoryRef Id="bin97543xxxx">
<Component Guid="cb21cd16-4bb9-4e57-a13c-4d064f01cd43" Id="bin_wrapper_windows_x86_64_exe189026768">
<File KeyPath="yes" Source="bin\wrapper-windows-x86-64.exe" DiskId="1" Name="wrapper-windows-x86-64.exe" Id="fl_bin_wrapper_windows_x86_64_exe189026768"/>
<RemoveFile Name="wrapper.log" On="uninstall" Id="rm_fl_bin_wrapper_log123456789"/>
<ServiceInstall Name="Test App" Description="Test App" Arguments="-s &quot;..\conf\wrapper.conf&quot; wrapper.console.flush=true" Type="ownProcess" Vital="yes" Start="auto" Account="LocalSystem" ErrorControl="ignore" Interactive="no"/>
<ServiceControl Id="StartService" Name="Test App" Start="install" Stop="both" Remove="uninstall" Wait="yes"/>
</Component>
</DirectoryRef>

这个 native 包装器将启动 JVM java.exe 以及其他一些 JAR 和 native DLL。这些 JAR 和 DLL 被定义为单独的组件,例如:

    <DirectoryRef Id="bin_wrapper_lib172428748">
<Component Guid="91ea3118-769e-4100-80a2-f09a586500a5" Id="bin_wrapper_lib_wrapper_jar565349582">
<File Source="bin\wrapper\lib\wrapper.jar" DiskId="1" Name="wrapper.jar" Id="fl_bin_wrapper_lib_wrapper_jar565349582"/>
</Component>
</DirectoryRef>

当我尝试卸载该程序时,它会检测到 java.exe 正在使用的文件,即使当服务停止时它也会停止 JVM。我已经通过在尝试卸载之前手动停止该服务来验证这一点。另请注意,如果我继续,所有文件都会成功删除,只有 Windows 服务仍然存在(但标记为已删除)。 MSI 日志显示:

Action start 15:48:40: InstallValidate.
...
MSI (s) (AC:68) [15:48:40:424]: RESTART MANAGER: Detected that application with id 3636, friendly name 'java.exe', of type RmCritical and status 1 holds file[s] in use.
MSI (s) (AC:68) [15:48:40:424]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.
...
MSI (s) (AC:68) [15:48:59:078]: RESTART MANAGER: The user chose to go on with the installation, although a reboot will be required.
...
The setup must update files or services that cannot be updated while the system is running. If you choose to continue, a reboot will be required to complete the setup.

我在 SO 和 WiX Toolset 用户邮件列表上看到了一些类似的问题,但没有什么真正有帮助的。很多人尝试使用自定义操作,并被告知使用 ServiceControl,而我已经在使用它。

我还看到有人提到“使用中的文件逻辑”,我认为这就是重新启动管理器正在做的事情。有人建议使用 ServiceControl 元素将相关文件添加到组件中,但这似乎并不正确(或者至少我不确定如何做到这一点,并且仍然遵循分离组件的最佳实践)。

有人能指出我正确的方向吗?

最佳答案

可能是相关帖子 - WiX: Avoid showing files-in-use dialog and just prompt for reboot at end of install

设置 MSIRESTARTMANAGERCONTROL=禁用。如果这不起作用,请从 MSI 中删除 FileInUse 对话框;)

关于java - 如何在使用 WiX Toolset(MSI 安装程序)卸载期间停止服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116265/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com