install4J,如何通过Java首选项存储正确地将'updatesUrl'传递给更新程序?

install4J,如何通过Java首选项存储正确地将'updatesUrl'传递给更新程序?,java,install4j,Java,Install4j,我正试图根据另一篇文章中的建议为我的应用程序实现多通道(deb/beta/stable)更新 我已完成以下步骤: 创建编译器变量mediaID=${compiler:sys.mediaID} 当我的应用程序的用户更改其发布频道首选项时,将调用以下函数:mediaID=Variables.getCompilerVariable(“mediaID”);Variables.saveToPreferenceStore(Map.of(“updatesUrl”,xmlURL),mediaID,true) 当

我正试图根据另一篇文章中的建议为我的应用程序实现多通道(deb/beta/stable)更新

我已完成以下步骤:

  • 创建编译器变量
    mediaID=${compiler:sys.mediaID}
  • 当我的应用程序的用户更改其发布频道首选项时,将调用以下函数:
    mediaID=Variables.getCompilerVariable(“mediaID”);Variables.saveToPreferenceStore(Map.of(“updatesUrl”,xmlURL),mediaID,true)
  • 当用户决定更新时,调用以下函数:
    ApplicationLauncher.launchApplicationInProcess(更新程序\u应用程序\u ID,null,…)
    但这会引发错误(退出值=1):
  • 根据错误消息,更新程序似乎没有找到
    updateurl
    变量,但就在调用函数之前,我记录了
    com.install4j.api.launcher.Variables.loadFromPreferenceStore的输出(mediaID,true)我得到的结果是
    {updatesUrl=https://github.com/akasolace/HO/releases/download/dev/updatesDEV.xml}
    这是合法的URL,因此似乎updatesUrl已正确存储

    现在,我对这应该如何工作感到有点困惑。例如,我在parralel中运行2版应用程序,我的设置如下:

    {(1, "updatesUrl"): "...updatesSTABLE.xml", (2, "updatesUrl"): "...updatesDEV.xml"}
    
    • mediaID 1,释放通道稳定
    • MediaID2,发布频道开发
    在我的系统上,我将变量
    updatesUrl
    存储在两个不同的包中,类似于:

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

    • 我认为applicationID对于应用程序是唯一的,mediaID对于每种媒体都是不同的。为了实现我想要的,我认为我需要更新程序用作包名,即调用它的媒体的媒体ID。我的意思是,如果从媒体ID x调用更新程序,我需要它查看变量“updatesUrl”从x包。这是可行的还是我迷路了
    [编辑]我试图将“从Java首选项存储加载安装程序变量”的包名设置为
    ${compiler:sys.mediaId
    ,但这会引发

    提前感谢您的帮助

    使用以下堆栈跟踪

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

    调用
    com.install4j.api.launcher.Variables.loadFromPreferenceStore
    不会设置安装程序变量,它会返回一个带有变量值的映射。这是为了在应用程序中使用


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

    这就是我在问题
    中提到的操作“从Java首选项存储加载安装程序变量”,我看到包名默认为${compiler:sys.applicationId}
    仍然是为了调试目的,我配置了“从Java首选项存储加载安装程序变量”“通过对包进行硬编码,我在java首选项存储中存储
    updatesUrl
    时使用的mediaID值为56。在我的应用程序中,如果我调用
    loadFromPreferenceStore(“56”,true);
    在更新之前,我得到
    {updatesUrl>=https://github.com/akasolace/HO/releases/download/dev/updatesDEV.xml}
    这是有效的url,但更新程序仍然无法从存储中加载它,尽管它已硬编码,因为它抛出了我在问题中显示的错误(内部错误…)。错误对话框显示使用的url为空。请尝试将“检查更新”操作的“更新描述符url”属性替换为${installer:updatesUrl}并查看更新下载程序的日志文件输出。我发现了我的错误:“从Java首选项存储加载安装程序变量”操作不在启动节点中。我应该更仔细地阅读文档。我需要更多测试,但到目前为止,它似乎工作正常。非常感谢您宝贵的帮助!