我想在 Mac OS X 10.7.5 上使用以下代码在 java 中启动一个 .app 应用程序:
Runtime.getRuntime().exec(new String[] { "/usr/bin/open", filename });
文件名包含物理路径和文件名。
如果我在 MAC 文件管理器 Finder 上双击文件名,一切正常。
如果我执行上面显示的代码行,我会收到众所周知的错误消息“TeamViewerQS 意外退出单击重新打开以再次打开应用程序...”
如果我单击“重新打开”按钮,应用程序将毫无问题地启动。
那么我怎样才能避免这个令人不安的错误信息呢?
如果您需要有关此问题的更多信息,请告诉我。谢谢你。
2013-10-04:好的,现在我有时间再次执行此任务,这里出现了要求的工作代码(StreamGobbler 与“当 Runtime.exec() 不会”中描述的相同):
/**
* Start the teamviewer application on a mac.
*
* @param filename Full physical path and filename to be started
* @throws IOException
*/
protected void startTeamViewerOnMac(String filename) throws Throwable{
String[] cmd = new String[] { "/usr/bin/open", filename };
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
// Creation of the stout and errout handler
StreamGobbler errorGobbler = new
StreamGobbler(proc.getErrorStream(), "TeamViewer start Error");
StreamGobbler outputGobbler = new
StreamGobbler(proc.getInputStream(), "TeamViewer start STDOUT");
// Start them
errorGobbler.start();
outputGobbler.start();
int exitVal = proc.waitFor();
JLog.submit(this, "ExitValue:" + exitVal, Level.WARN);
} // end of startTeamViewerOnMac
记录器的输出:
04.10.2013 14:38:02 WARN [main.frame.PdfHelpPanelSetlog->startTeamViewerOnMac] ExitValue:0
因此,在错误屏幕之前或之后都没有生成 STDOUT 或 ERROUT。
我还尝试使用二进制文件的完整路径。=> 行不通。
我也试过这个:
protected void startTeamViewerOnMac(String filename) throws Throwable {
ProcessBuilder pb = new ProcessBuilder("/usr/bin/open", filename);
Process proc = pb.start();
// Creation of the stout and errout handler
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "TeamViewer start Error");
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "TeamViewer start STDOUT");
// Start them
errorGobbler.start();
outputGobbler.start();
int exitVal = proc.waitFor();
JLog.submit(this, "ExitValue:" + exitVal, Level.DEBUG);
}
=> 出现同样的错误信息