当前位置: 首页 > 知识库问答 >
问题:

如果应用程序打开,则Jpackage MSI升级无法完成

陈茂
2023-03-14

我正在使用Jpackage为我们的java应用程序开发MSI安装程序。

版本:

openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12)
OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode, sharing

jpackage 17.0.1

OS Name:                   Microsoft Windows Server 2019 Datacenter
OS Version:                10.0.17763 N/A Build 17763
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Server
OS Build Type:             Multiprocessor Free

J包装用法:

jpackage --input ./home ^
  --name "Acme Application" ^
  --main-jar app.jar ^
  --main-class org.springframework.boot.loader.JarLauncher ^
  --java-options "-splash:$APPDIR/splash.png" ^
  --java-options -Xmx2g ^
  --icon resources/package.ico ^
  --win-shortcut ^
  --win-menu ^
  --type msi ^
  --app-version %1

升级过程

安装工作正常,一切运行良好。升级过程在正常情况下也工作正常。当用户尝试在应用程序仍在运行时运行新的MSI包时,MSI安装程序会提示用户关闭应用程序,然后再继续:

选择关闭应用程序并继续会导致用户桌面上的应用程序关闭,但安装程序随后会使用相同的对话框再次提示用户。选择相同的选项(关闭并继续),允许安装程序完成,但随后会警告用户需要重新启动。

重新启动时,应用程序版本1.0.0似乎仍在运行。检查前后的jar文件签名显示安装程序未能覆盖原始文件。

事件查看器

检查事件查看器,我只看到一些有趣的东西:

Windows Installer requires a system restart. Product Name: *******. Product Version: 1.0.1. Product Language: 1033. Manufacturer: Unknown. Type of System Restart: 1. Reason for Restart: 0.

The Windows Installer initiated a system restart to complete or continue the configuration of '*******'.

无法停止应用程序

我还注意到应用程序并没有完全停止。查看任务管理器,它显示应用程序在用户下运行,然后移动到后台进程。这让我相信它仍然锁定jar文件。应用程序在其他情况下正常停止,所以我不确定这里有什么不同。

我假设我需要解决这个谜团,但我不知道为什么应用程序在处理其他所有事情时不会响应安装程序的关闭信号。

共有1个答案

游安康
2023-03-14

好的,我做了一些调查,这与JavaFX的生命周期有关。简单地覆盖Application.stop方法不足以正确关闭这些类型的关闭请求。

对我的应用程序进行的两项更改修复了此问题:

在CloseRequest的主阶段注册一个EventHandler

在这里,我初始化我的Spring应用程序并注册事件处理程序以停止应用程序:

@Override
public void start(Stage stage) {
    applicationContext.publishEvent(new StageReadyEvent(stage));
    stage.setOnCloseRequest(event -> stop());
}

确保您在事件处理程序中呼叫系统退出

在以下情况下,平台退出不足以关闭应用程序:

@Override
public void stop() {
    log.info("Shutting down application...");
    applicationContext.close();
    Platform.exit();
    log.info("Shutdown complete");

    // System.exit is required or the app will move to a background process on uninstall/upgrade
    // events from Windows MSI installer
    System.exit(0);
}
 类似资料:
  • 我正在用mssql数据库开发一个java Spring Hibernate应用程序。但是我无法与mssql数据库建立连接。 [请求处理失败;嵌套异常为org.springframework.transaction.CanNotCreateTransactionException:无法打开事务的Hibernate会话;嵌套异常为org.Hibernate.exception.GenericJDBcE

  • 我有一个使用Spring mvc和Spring Security Eclipse Maven web项目。当我真的启动它时,它没有成功地初始化上下文: 更多详情如下: 这是我的 这是我的 我的问题是,当我启动应用程序时,我会出现类似的错误 它说它找不到但是我没有把它放进中,我的配置文件是

  • 我用保存了一个文件。我的应用程序中的docx扩展名。该文件保存在sdcard中。该文件在我的sdcard中显示为word文件,但我无法打开它(使用polaris或任何其他默认软件),并显示消息“不支持的文件”。 当我保存扩展名为. txt的文件时,我可以打开它。 谢谢亚历山德鲁...但现在我在运行应用程序时收到一条错误消息,指出“此元素的Javadoc既无法在附加的源代码中找到,也不能在附加的Ja

  • MacOS 升级到 10.15.X (Catalina) 后,无法打开 JDK。该消息显示“JDK 无法打开,因为无法验证开发人员”。

  • 有趣的是,当我从头创建一个新应用程序时,pubspec.lock没有任何关于Flutter版本的信息。这个部分现在只包含以下内容:。将来,我怎么知道这个应用程序运行的是哪个版本? 我尝试在我的应用程序中运行“Flutter upgrade”,但那是为了升级SDK,而不是应用程序的Flutter版本。那么我该如何升级我的应用程序来使用最新的Flutter版本呢?还是总是使用最新版本的SDK构建?我不