【问题标题】:Mac: attach commandline parameters to a running application on Mac failedMac:将命令行参数附加到 Mac 上正在运行的应用程序失败
【发布时间】:2015-05-21 04:04:49
【问题描述】:

今天我在 MacOs 上遇到了一个奇怪的问题。我希望我能准确地解释前提条件以供理解。我们使用的是 install4j 版本 6.0.1。

我们的应用程序使用 install4j 静默更新检查应用程序作为主要“启动器”来实现,以在我们的应用程序启动过程中检查更新。此应用程序完全由 install4j IDE 配置。它检查是否存在更新,并为此下载新的安装程序并执行它。这工作正常。如果应用程序是最新的,“主”应用程序启动器将由Execute Launcher-action 执行。因此,“extraCommandLineArguments”将被传递给启动器并启动应用程序。这也很好,参数将正确传递给我们的主类。

现在奇怪的行为:当我在第一个实例始终运行期间使用多个参数启动应用程序两次时,参数不会传递给第一个实例,也不会创建第二个实例。启动器由 install4j 配置以允许应用程序的多个实例,而单实例选项由我们的应用程序本身实现。因此主类检查一个实例是否一直在运行,并将参数传递给第一个实例。现在似乎永远不会创建第二个实例,因为我无法在调试模式下通过 IDE 附加到 vm-process。因此,我将调试 vm 参数设置为 vmoption 文件。我尝试了几个选项来启动第二个实例:

  • 使用“updater”-应用程序正常执行我们的应用程序并设置命令行参数
  • 通过launcher-executable直接执行我们的应用程序并设置命令行参数
  • 通过调用启动器的 JavaApplicationStub 并将命令行参数传递给它来执行我们的应用程序

对于所有选项,正在运行的实例将获得焦点但不接收任何参数,并且我无法通过 IDE 附加第二个进程来调试行为。看来我们的应用程序(主类)不会被第二次执行。在Info.plist 文件中,MacLauncher 类被识别为主类。是否实现了任何逻辑来搜索正在运行的实例并忽略第二个?

奇怪的是:在 Windows 上一切正常。第二个进程将参数传递给正在运行的实例。 mac上有什么不同?如何检查 install4j 是否正在调用我们在启动器中配置的主应用程序类?是否有任何调试选项?

提前感谢您的帮助。

【问题讨论】:

    标签: install4j


    【解决方案1】:

    在 Mac OS X 上,GUI 应用程序默认处于单实例模式。这是 Mac OS X 桌面环境的属性。打开第二个实例的唯一方法是调用

    open -n my.app
    

    【讨论】:

    • 嗯,但是对于我们应用程序的早期版本和 install4j 版本 5.1.15,如果没有您提到的选项,这已经可以工作了。
    • 另一个问题:如何将您的解决方案传递给 install4j 中的 Execute Launcher 操作?
    • 我不确定在这方面会发生什么变化。捕获后续调用的命令行参数,可以使用API​​中的com.install4j.api.launcher.StartupNotification类。
    • install4j 中的动作不能做 open -n
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2021-02-23
    相关资源
    最近更新 更多