install4J,如何通过 Java 偏好存储将 `updatesUrl` 正确传递给更新程序?
install4J, how to correctly pass `updatesUrl` to the updater via the Java preference store?
我正在尝试根据另一个 中的建议为我的应用实施多渠道 (deb/beta/stable) 更新。
我已经完成了以下步骤:
- 创建编译器变量
mediaID=${compiler:sys.mediaId}
- 当我的应用程序的用户更改它发布频道首选项时,会调用以下函数:
mediaID = Variables.getCompilerVariable("mediaID"); Variables.saveToPreferenceStore(Map.of("updatesUrl", xmlURL), mediaID, true);
- 当用户决定更新时调用以下函数:
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 版本,我的设置类似于:
- mediaID 1,发布频道稳定
- mediaID 2,发布频道Dev
在我的系统上,我将变量 updatesUrl
存储在 2 个不同的包中,例如:
{(1, "updatesUrl"): "...updatesSTABLE.xml", (2, "updatesUrl"): "...updatesDEV.xml"}
现在,在 install4J 中,我添加了操作“从 Java 首选项存储加载安装程序变量”,我看到包名称默认为 ${compiler:sys.applicationId
。这导致了以下问题:
- 我相信应用程序的 applicationID 是唯一的,而每种媒体的 mediaID 是不同的。为了实现我想要的,我相信我需要将更新程序用作包名称,即调用它的媒体的媒体 ID。我的意思是,如果从媒体 ID x 调用更新程序,我需要它查看包 x 中的变量“updatesUrl”。这是可行的还是我迷路了?
[编辑] 我试图将“从 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
安装程序变量实际上设置为首选项存储中的值。
我正在尝试根据另一个
我已经完成了以下步骤:
- 创建编译器变量
mediaID=${compiler:sys.mediaId}
- 当我的应用程序的用户更改它发布频道首选项时,会调用以下函数:
mediaID = Variables.getCompilerVariable("mediaID"); Variables.saveToPreferenceStore(Map.of("updatesUrl", xmlURL), mediaID, true);
- 当用户决定更新时调用以下函数:
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 版本,我的设置类似于:
- mediaID 1,发布频道稳定
- mediaID 2,发布频道Dev
在我的系统上,我将变量 updatesUrl
存储在 2 个不同的包中,例如:
{(1, "updatesUrl"): "...updatesSTABLE.xml", (2, "updatesUrl"): "...updatesDEV.xml"}
现在,在 install4J 中,我添加了操作“从 Java 首选项存储加载安装程序变量”,我看到包名称默认为 ${compiler:sys.applicationId
。这导致了以下问题:
- 我相信应用程序的 applicationID 是唯一的,而每种媒体的 mediaID 是不同的。为了实现我想要的,我相信我需要将更新程序用作包名称,即调用它的媒体的媒体 ID。我的意思是,如果从媒体 ID x 调用更新程序,我需要它查看包 x 中的变量“updatesUrl”。这是可行的还是我迷路了?
[编辑] 我试图将“从 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
安装程序变量实际上设置为首选项存储中的值。