【发布时间】:2012-07-25 11:44:23
【问题描述】:
在我正在编写的应用程序中,我正在使用 Runtime.exec(...) 启动另一个应用程序(可运行的 JAR)。一切都在 Windows 中成功启动,但 Linux(特别是 CentOS 的某些安装 - 在 Ubuntu 中工作)一直给我一些问题。出于某种原因,辅助应用程序成功启动的唯一方法是我通过终端执行第一个应用程序。所有行为都按预期工作。但是,如果我通过双击第一个应用程序的图标(没有打开终端)启动第一个应用程序,启动第二个应用程序的按钮似乎什么也不做。我没有收到任何异常或错误输出 - 只是我的进度条一闪,说它正在启动,然后什么也没有。我可以通过 jconsole 确认第二个应用程序的进程永远不会启动。
我已经看到了关于 exec 方法的陷阱的常用链接文章 (http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html),但是我在那里找到的任何东西都无法解决这个问题。我实际上正在读取第二个进程的输出和错误流,因为我在它成功运行时看到了所有输出(在通过终端命令启动第一个应用程序之后)。不太了解 Linux 的更深层次的工作原理,我认为这听起来可能是输出流的权限问题之类的,但我不确定。
如果有助于诊断问题,我使用以下命令:
rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."}); 因为这有效(取决于应用程序的启动方式),我不太担心这段代码有什么问题......
有人有什么建议吗?提前致谢!
编辑:解决方案是将目录修复为我试图运行的 JAR。通过 GUI 启动时,user.dir 指向包含我的应用程序的文件夹的父目录。由于我使用的是 Eclipse RCP,我的解决方案是使用
String currDirPath = Platform.getInstallLocation().getURL().toString(); 代替。感谢大家的帮助!
【问题讨论】:
-
这仍然可能是 stdout/stderr 流的问题。尝试使用
popen而不是exec并捕获进程的输出。 -
为什么不尝试使用 ProcessBuilder.start() 而不是 Runtime.exec()?前者总是可取的。
-
谢谢,伙计们。我会尝试并更新您的建议。
标签: java linux terminal runtime.exec