如何使用Runtime在Java中运行Mac OS终端命令?

11

我一直在查找使用Java的运行时来运行外部程序的方法。比如下面这段代码可以实现:

String[] cmd = {"mkdir", "test"};
Runtime.getRuntime().exec(cmd);

创建一个新目录,就像你期望的那样。现在,在 Mac 的 bash 窗口中,我可以这样写:

love testgame

在名为testgame的文件夹上运行“Love”游戏引擎。现在,这个命令之所以有效,是因为我将“love”别名设为调用love可执行文件的命令。我有一种感觉,这就是以下命令无法工作的原因:

String[] cmd = {"love", "/Users/mtc06/testgame"};
Runtime.getRuntime().exec(cmd);

这个也不行(对于那些想知道的人):

String[] cmd = {"/bin/bash", "love", "/Users/mtc06/testgame"};
Runtime.getRuntime().exec(cmd);
毫无疑问,这可能是由于我某些Java方面的愚蠢或者与别名工作方式冲突导致的。我将其交给你们威望卓著的智慧,Stack Overflow社区!更新:这个也不起作用:
String[] cmd = {"/bin/sh", "/Applications/love", "/Users/michaelcook/Desktop/Playout"};
Runtime.getRuntime().exec(cmd);

我收到的错误是来自Runtime生成的进程,错误代码是127。无论我在哪里查找它,都会得到“命令未找到”的提示。


请尝试提供“love”的绝对路径。 - Erik
谢谢,尝试了这个但没有成功。正在更新问题。 - mtrc
/Application/love 是什么?/bin/sh /Application/love ... 在命令行上真的有效吗? - Volker Stolz
“testgame” 是一个 Java 应用程序包吗? - Erik
不,testgame是一个文件夹,Love知道如何打开和运行。 - mtrc
1个回答

10

我猜测你遇到的问题是查找可执行文件的路径。这也取决于你使用的是OSX应用程序还是Unix命令。

如果使用的是Unix命令(或者使用OSX应用程序的Unix部分,例如/Applications/AppName.app/Contents/MacOS/AppName),则有两种方法可以解决此问题:

  1. 在Java代码中放入可执行文件的完整路径,例如:
    String[] cmd = {"/full/absolute/path/to/love", "/Users/mtc06/testgame"};

  2. 更改路径以包括可执行文件。这取决于启动Java的方法。

a)如果从命令行运行Java,则将可执行文件所在目录添加到PATH环境变量中。
b) 对于旧版本的OSX和如果从Finder运行Java程序,则必须在~/MacOSX/environment.plist中更改路径,例如添加/Users/mark/bin。

   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
   <plist version="1.0">
   <dict>
      <key>PATH</key>
      <string>/Users/mark/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/libexec/binutils:</string>
   </dict>
   </plist>

如果这个应用程序是一个OSX应用,那么你需要使用open命令来启动它,命令行如下:

open 应用程序路径

open -a love.app "/Users/mtc06/testgame"  

所以Java命令是(未经测试)

String[] cmd = {"/usr/bin/open", "-a" , "love.app",  "/Users/mtc06/testgame"};

谢谢,我看了一下,你差不多立刻让我意识到问题出在 love.app 上面,而不是 love。干得好,谢谢! - mtrc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接