【问题标题】:OS X Java .app bundle cannot open other apps?OS X Java .app 包无法打开其他应用程序?
【发布时间】:2016-08-05 06:12:40
【问题描述】:

我为 OS X 编写了一个 Java SWT 应用程序,将其导出为 .jar 并将其捆绑到 .app 中。除了我的应用程序中的关键部分外,一切都按预期工作;它需要打开其他应用程序。

我已经尝试Runtime.exec();ProcessBuilder 来执行此操作,在我需要启动的其他应用程序上调用open 命令。这在 Eclipse 上运行得非常好,或者如果我通过终端启动导出的 .jar。但是,通过双击 .app 启动时,它不起作用。

我想知道这是我的错误,还是 Java 或 OS X 的限制。因为 Mac 应用程序是沙盒的(据我了解),这可能是为什么从应用程序内调用 open什么都不做?

我使用了两种方法来打开我需要的应用程序。这是一款 Steam 游戏,但也是零售版,因此可以通过应用程序本身或使用steam:// 协议启动。在我的代码中,我尝试了以下方法:

ProcessBuilder pb = new ProcessBuilder("open", "steam://rungameid/57300//");
pb.start();

ProcessBuilder pb = new ProcessBuilder("open", appDir);
pb.start();

appDir 是一个字符串,其中包含我希望启动的 .app 包的路径。

任何想法为什么这在 Mac 应用程序包中失败,但在 Eclipse/Jar 中运行良好?使用控制台运行应用程序(通过捆绑包中的 bash 脚本)不会返回任何错误,所以在我看来 Java 可以正常运行命令,但 OS X 可能会忽略它?

我也尝试在 Google 上搜索此内容,但它似乎非常罕见或非常具体,我无法找到任何东西。

【问题讨论】:

  • 您在控制台中收到任何消息吗?
  • 您是否尝试过使用Runtime.exec(),详情请参阅此处的答案:stackoverflow.com/questions/19456454/…
  • 您究竟为“appDir”指定了什么?
  • @Francis 我最初使用Runtime.exec(),命令只有一个字符串。它具有相同的效果,但我转到ProcessBuilder 看看它是否有任何不同。我还没有用字符串数组尝试Runtime.exec()(但我可以在几个小时内尝试)。
  • @greg-449 appDir 是一个动态字符串,其中包含 .app 包的绝对路径。例如/Applications/TextEdit.app

标签: java eclipse macos swt .app


【解决方案1】:

我自己回答这个问题,因为问题是我自己的设置。具体来说,它是我使用的捆绑运行时。我在这里的另一个问题中写了一个更深入的答案:

Java on OS X: “open” command won't run if .app package contains a JVM bundle

【讨论】:

    【解决方案2】:

    如果steam:是注册的URL类型,你可以使用org.eclipse.swt.program.Program#launch(String)。例如:

    org.eclipse.swt.program.Program.launch("steam://rungameid/57300//");

    【讨论】:

    • 谢谢你。它解决了一半的问题。我能够从应用程序包中运行它。至于另一半,我没有指定,但我需要两种方法都可以工作(蒸汽和正常的应用程序启动),但这是进步!
    • 我刚刚测试了这个以启动应用程序,并且能够启动 TextEdit 和我想要的应用程序。所以基本上这似乎不像open 那样被忽略。您知道是否可以通过这种方式指定参数?我把它排除在外,因为它似乎无关紧要,但我无法使用它来使用相同的 args。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多