我正在使用WiX Toolset創建MSI安裝程序。這將安裝具有作爲服務安裝的本機包裝的Java應用程序。如何在使用WiX Toolset(MSI Installer)進行卸載時停止服務?
我已經安裝好了,但是當我嘗試卸載它時,重新啓動管理器檢測到正在使用的文件並顯示一個對話框,指出需要重新啓動。
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服務仍然存在(但標記爲已刪除)。微星日誌顯示此:
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.
我已經看到了等等一些類似的問題和WiX的工具集用戶郵件列表,但沒有真正的幫助。很多人都在嘗試使用自定義操作,並被告知使用ServiceControl,而不是我已經使用的。
我還看到有人提到「正在使用的文件邏輯」,我認爲這是重新啓動管理器正在做的事情。有人建議使用ServiceControl元素將相關文件添加到組件中,但這似乎不正確(或者至少我不確定如何執行此操作,仍然遵循有關分離組件的最佳做法)。
任何人都可以指向正確的方向嗎?