0

在我正在编写的应用程序中,我正在使用 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();改用。感谢大家的帮助!

4

2 回答 2

2

由于您只是使用 jar 文件名 - myjarfile.jar - 而不是它的完整路径,这取决于当前的工作目录,可能会或可能不会找到 jar。尝试更改您的 exec 命令以使用 jar 的完整路径。您可以通过使用 rt.exec() 将“pwd”的输出写入文本文件来进行调试。

于 2012-07-25T12:17:09.963 回答
0

代替

 rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."});

采用

rt.exec(new String[]{"\bin\bash", "-c", "/***path to java***/java -jar myjarfile.jar myArg1 myArg2 ..."});
于 2012-07-25T12:03:07.553 回答