Я использую WiX Toolset для создания установщика MSI. Это устанавливает приложение Java, которое имеет собственную оболочку, которая устанавливается как служба.
У меня есть это для установки, но когда я пытаюсь удалить его, диспетчер перезапуска обнаруживает используемые файлы и отображает диалоговое окно, в котором говорится, что требуется перезагрузка.
Служба Windows запускает собственную оболочку 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 "..\conf\wrapper.conf" 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>
Эта собственная оболочка запускает JVM java.exe
с некоторыми другими JAR и собственными библиотеками 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, но это здесь не похоже (или, по крайней мере, я не уверен, как это сделать, и все еще следую лучшим практикам по разделению компонентов).
Может кто-то указать мне верное направление?