install4J,如何通过 Java 偏好存储将 `updatesUrl` 正确传递给更新程序?

install4J, how to correctly pass `updatesUrl` to the updater via the Java preference store?

我正在尝试根据另一个 中的建议为我的应用实施多渠道 (deb/beta/stable) 更新。

我已经完成了以下步骤:

  1. 创建编译器变量mediaID=${compiler:sys.mediaId}
  2. 当我的应用程序的用户更改它发布频道首选项时,会调用以下函数:mediaID = Variables.getCompilerVariable("mediaID"); Variables.saveToPreferenceStore(Map.of("updatesUrl", xmlURL), mediaID, true);
  3. 当用户决定更新时调用以下函数: ApplicationLauncher.launchApplicationInProcess(UPDATER_APPLICATION_ID, null, ....) 但这会引发错误(退出值 = 1):

根据错误消息,更新程序似乎没有找到 updatesUrl 变量,但就在调用函数之前,我记录了 com.install4j.api.launcher.Variables.loadFromPreferenceStore(mediaID, true); 的输出,结果得到了{updatesUrl=https://github.com/akasolace/HO/releases/download/dev/updatesDEV.xml} 这是合法的 URL,因此 updatesUrl 似乎已正确存储。

现在,我对这应该如何工作有点困惑。以我为例,我是 运行 并行应用程序的 2 版本,我的设置类似于:

在我的系统上,我将变量 updatesUrl 存储在 2 个不同的包中,例如:

{(1, "updatesUrl"): "...updatesSTABLE.xml", (2, "updatesUrl"): "...updatesDEV.xml"}

现在,在 install4J 中,我添加了操作“从 Java 首选项存储加载安装程序变量”,我看到包名称默认为 ${compiler:sys.applicationId。这导致了以下问题:

[编辑] 我试图将“从 Java 首选项存储中加载安装程序变量”的包名称设置为 ${compiler:sys.mediaId 但这会抛出

预先感谢您的帮助。

具有以下堆栈跟踪

    java.lang.NullPointerException
 com.install4j.runtime.installer.Application.runApplicationInProcess(Application.java:64)
com.install4j.runtime.installer.helper.apiimpl.ApplicationLauncherImpl.run(ApplicationLauncherImpl.java:57)

调用 com.install4j.api.launcher.Variables.loadFromPreferenceStore 不会设置安装程序变量,它 returns 具有变量值的映射。这适用于您的应用程序。

您需要做的是将“从 Java 首选项存储加载安装程序变量”操作添加到更新下载器中的“启动”节点。这样,updatesUrl 安装程序变量实际上设置为首选项存储中的值。