提供ProcessBuilder的提示以帮助命令行实用程序使用其他实用程序

时间:2012-12-04 05:28:17

标签: java macos processbuilder

我正在使用jhead检查图像是否设置了Orientation标志,如果是,则旋转它并设置exif信息以指示在查看时不需要旋转它。它在命令行上看起来像:

jhead -autorot 'IMG_3680.JPG'

我正在尝试使用ProcessBuilder从我正在查看的图片上的java应用程序中调用它,但它使用jpegtran来进行实际的图像旋转。这两个应用程序都可以从命令行正常运行,并且位于我的Mac上的/opt/local/bin

我一直在:

sh: jpegtran: command not found

Error : Problem executing specified command
in file '/images/IMG_3681.JPG'

我的代码是:

public static void main(String[] args) throws Exception {

    File[] files = (new File("/images")).listFiles();
    for (File file : files){
      ProcessBuilder pb = new ProcessBuilder("jhead", "-autorot", file.getAbsolutePath());
      pb.redirectOutput(Redirect.INHERIT);
      pb.redirectError(Redirect.INHERIT);
      Process p = pb.start();
    }
}

我是否需要向ProcessBuilder提供提示,以便jhead能够致电jpegtran

1 个答案:

答案 0 :(得分:0)

经过一些猜测后,我确定PATH环境变量未正确设置。它有/usr/bin:/bin:/usr/sbin,显然不包括/opt/local/bin。我这样添加了它:

Map<String, String> env = pb.environment();
env.put("PATH", env.get("PATH")+":/opt/local/bin/");

现在可以产生正确的结果。但真正的解决方案是将/opt/local/bin/添加到PATH环境变量中,而不是直接在代码中添加它。

<小时/> 更新:经过一番观察,如果我从终端而不是Eclipse运行我的应用程序,这似乎不会有问题。在终端中正确设置了PATH变量,但我不得不将其添加到Eclipse中。要将它添加到Eclipse:

  1. Goto Run - &gt;运行配置 - &gt;环境
  2. 点击新建,然后输入名称PATH,输入值/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin/
  3. 点击“应用”。
  4. 如果你确实需要在OS X中设置它,那么似乎有几种方式(或者实际上有几种方式)。如果您需要通过Spotlight启动的应用程序,请转到here。如果你需要为终端设置if而不是here