需要java的系统调用帮助

时间:2009-08-21 22:42:51

标签: java runtime

我正在使用Runtime来调用系统。

当我用“ls -l”调用它并读取它得到的内容时,它会完全按预期打印目录内容。

然而,当我用“which ffmpeg”或“ffmpeg -i FILENAME”调用它时,它回来说ffmpeg无法定位,即使我在命令行使用ffmpeg完全相同的方式它工作正常。同样,它拒绝使用“哪个mysql”或“哪个perl”所有存在并在系统上正常工作。

我认为它是某种权限的东西,但我不知道如何绕过它。

有什么想法吗?

编辑 -

一些额外的信息......我在Eclipse中运行它作为junit,所以,也许这都是环境问题。我从来没有为此专门配置Eclipse ......也许我需要?当我传入命令“echo $ PATH”时,它只打印出“$ PATH”而不是实际路径;再次,不知道这意味着什么。最后,我在OSX上,所以,如果有帮助的话,你可以将其视为linux问题。

6 个答案:

答案 0 :(得分:3)

你在考虑环境设置的情况下钉了它。如果右键单击JUnit测试,请转到“运行方式...”,然后转到“运行配置...”选项。在弹出窗口中,您会注意到一个名为“Environment”的选项卡。这是您的JUnit测试将查找您的环境的地方,包括您的“PATH”变量。

如果您希望测试找到“ffmpeg”,那么您应该在命令行上执行“which ffmpeg”并获取结果。在Eclipse中,单击Environment选项卡上的“New ...”按钮,并将PATH作为变量名称和包含“ffmpeg”的目录作为值。我相信这很有效。

注意:您需要包含ffmpeg的目录的路径,而不是ffmpeg的完整路径

因此,如果'which ffmpeg'返回'/ usr / bin / ffmpeg',则将PATH的值设置为'/ usr / bin'。

或者,如果以维护已设置环境的方式启动Eclipse,则应该可以访问它。这可能比您想象的要复杂,因为Eclipse启动脚本往往会在启动时擦除大量环境。我推荐第一种方式。

答案 1 :(得分:0)

我的猜测是JVM运行时作为除您以外的其他人运行并且具有不同的路径。 “ls”在/ bin中,“which”通常在/ usr / bin中。尝试运行“/ usr / bin / which”来验证这一点。不确定你的操作系统(并没有自己试过),但快速搜索提到你应该在Unix下将变量LD_LIBRARY_PATH设置为你想要的路径。

答案 2 :(得分:0)

当我在OSX上从x11运行“which ffmpeg”时,它说:

/ usr / bin / bin / usr / sbin / sbin / usr / X11R6 / bin中没有ffmpeg

这是$ PATH,我想。您的计划的输出是什么?

答案 3 :(得分:0)

你写道:

  

当我传入命令“echo $ PATH”时   只打印出“$ PATH”而不是   实际路径;再一次,不确定这意味着什么。

这很容易解释。扩展“$ PATH”通常由命令shell完成。运行时直接运行您的命令,而不是在命令shell中运行它。如果你想扩展$ PATH,你需要在shell中显式运行命令; e.g。

exec(new String [] {“/ bin / sh”,“ - c”,“echo $ PATH”});

顺便说一句,在使用fork()exec()运行命令的C / C ++程序中也会发生同样的事情。但是system()库函数在shell中运行命令,如上所述。

答案 4 :(得分:0)

我不确定是否是这种情况,但是this has helped in the past

答案 5 :(得分:0)

无论您的PATH设置如何,您都需要区分二进制文件和构建到 shell中的命令。

e.g。

% which ls
/bin/ls

% which which
which: shell built-in command

因此您使用的某些命令特定于shell,而不是其他运行时可直接使用的实际命令。