运行java程序的Mac shell脚本在dock中放了两个图标

Posted

技术标签:

【中文标题】运行java程序的Mac shell脚本在dock中放了两个图标【英文标题】:Mac shell script running java program puts two icons in the dock 【发布时间】:2010-01-27 22:36:56 【问题描述】:

我有一个执行 shell 脚本的 Mac 应用程序包。 shell 脚本调用 java 程序 1 来做一些事情,然后启动主 java 应用程序。此过程在 Dock 中为显示应用程序文件夹名称的 shell 脚本留下一个图标,在 Dock 中为 java 程序留下一个图标。

有什么方法可以防止 shell 脚本应用程序图标显示在 Dock 中?

【问题讨论】:

【参考方案1】:

是的,假设第一个Java程序可以运行headless:

java -Djava.awt.headless=true ...

附录:如果你使用JavaApplicationStub,启动过程的诊断输出可能如下:

$ 导出 JAVA_LAUNCHER_VERBOSE $ ./YourBundle.app/Contents/MacOS/JavaApplicationStub

【讨论】:

我不认为它是文档中第一个 java 程序的图标。我认为当 java 程序完成时它会消失。这就像有一个 shell 脚本的图标和一个正在运行的 java 程序的图标。我想摆脱 shell 脚本图标。 令人费解。如果 JVM 做了任何会抛出 HeadlessException 的事情,您将看到它的停靠图标。第二个进程是第一个进程的子进程吗?你是在使用JavaApplicationStub 还是只是你的脚本? 未使用 JavaApplicationStub。 shell 脚本是被执行的。每个 java 程序都通过调用 java... 单独调用【参考方案2】:

如果你不想要dock中的shell脚本图标,你需要启动,至少是主应用程序的第二个java进程,在exec模式下:

exec java -jar XXX

exec 表示,它将用新进程“替换”您当前运行的 shell。这完全符合您的要求。

我的 universalJavaApplicationStub 用于 Java 6/7 的方法相同,而且效果很好 :)

【讨论】:

【参考方案3】:

也许你可以在后台运行 Java 程序然后退出 shell 脚本?像这样的:

#!/bin/sh
first_java_program            # Synchronous, wait for it
nohup second_java_program &   # Run in the background, detach from terminal
exit 0                        # Indicate clean exit

另一种选择可能是在没有 Terminal.app 的情况下运行 shell 脚本,但直接使用 Unix 级别的 system(3) 调用或类似的东西,没有 GUI 交互。

【讨论】:

这听起来正是我所需要的,但是直到第二个 java 程序结束后才到达 exit 0 行。

以上是关于运行java程序的Mac shell脚本在dock中放了两个图标的主要内容,如果未能解决你的问题,请参考以下文章

从 OS X Dock 执行 Shell 脚本?

如何从 Dock、Mac 启动 Java 应用程序

如何在启用 Mac App Sandbox 的情况下运行 Shell 脚本?

从 Dock 中隐藏 Mac 应用程序

Mac 上将zsh用做默认Shell

MAC 系统的启动过程和系统启动时运行shell 脚本