【问题标题】:Providing a hint to ProcessBuilder to help commanline utility use other utilites向 ProcessBuilder 提供提示以帮助命令行实用程序使用其他实用程序
【发布时间】:2012-12-04 05:28:17
【问题描述】:

我正在使用jhead检查图像是否设置了方向标志,如果是,则旋转它并设置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

【问题讨论】:

  • jhead -autorot 'IMG_3680.JPG' :这在您的命令行中可以正常工作吗?
  • 您尝试将完整命令传递给进程构建器的路径? /opt/local/bin/jhead
  • @sheldonCooper 是的,在命令行上可以工作
  • @MadProgrammer 传递完整的命令会产生相同的结果。
  • 试一试 - 你可以使用 System.Runtime 来执行命令吗?

标签: java macos processbuilder


【解决方案1】:

经过一番猜测,我确定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. 转到运行 -> 运行配置 -> 环境
  2. 单击新建并为名称输入PATH 和值输入/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin/
  3. 点击应用。

如果您确实需要在 OS X 中设置它,那么似乎有几种方法(或者实际上是几个地方)。如果您需要它用于通过 Spotlight 启动的应用程序,请转到 here。如果您需要为终端设置 if 而不是转到 here

【讨论】:

  • 因为当你从终端运行时,你的程序继承了终端的环境,和eclipse一样
猜你喜欢
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2015-05-07
  • 2011-06-18
  • 2012-07-13
相关资源
最近更新 更多