【问题标题】:Program can't be found in PATH by Java Runtime on Mac OS XMac OS X 上的 Java Runtime 在 PATH 中找不到程序
【发布时间】:2013-02-13 11:44:20
【问题描述】:

我在 Mac OS X (10.7) 上使用 ImageMagick。我在MacPorts 的帮助下安装了它。

当我现在进入终端并写下:

identify image.jpg

一切正常。

但是现在在 Java 中执行它时,会抛出以下异常:

org.im4java.core.CommandException: java.io.FileNotFoundException: identify

我可以通过运行看到它在PATH 上:

which identify

响应:

/opt/local/bin/identify

现在正在运行:

echo $PATH

我得到了回应:

/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

同样的代码在安装了ImageMagick的Windows上也能完美运行。

那么为什么 im4java 根本没有在 PATH 中找到 identify

【问题讨论】:

  • 您是否尝试过“/opt/local/bin/identify”而不是“identify”?你如何在Java中调用命令?进程 exec = Runtime.getRuntime().exec(command);?
  • 我不调用命令。 ImageMagick 调用它,它必须在类路径上
  • 啊,好吧,我只是在某个时候使用 ImageMagick 进行转换,但是现有的库不太好,所以我使用了一个简单的 cmd 调用,这对我来说非常容易。
  • @Odelya 我为您提供的solution 工作了吗?如果是这样,您可以将其标记为答案。

标签: java macos path imagemagick identify


【解决方案1】:

就像描述的 here for OS X 10.8here for OS X 10.7 一样,唯一完整的解决方案是将您的 PATH 设置为 /etc/launchd.conf

默认情况下,应用程序的PATH 设置为/usr/bin:/bin:/usr/sbin:/sbin,即使您没有根本没有/etc/launchd.conf

因此,您必须在终端中执行以下操作:

sudo vi /etc/launchd.conf

并添加以下行或修改它,如果它已经存在:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

重要提示:现在您需要重新启动您的 Mac!

您可以使用以下代码在您的 Java 应用程序中重现您的 PATH

public class Main {
    public static void main (String[] args) {
        System.out.println("PATH=" + System.getenv().get("PATH"));
    }
}

还有第二种解决方案,如果您从 Eclipse 等 IDE 中启动您的程序,您也可以在那里设置 PATH。在 Eclipse 中,您可以通过Run | Run Configurations | Environment 执行此操作,同时在Java Application 下的左侧栏上选择您的启动配置。

我确实使用以下代码复制了它,image.jpg 位于 ${user.dir} 也就是你的 Java 应用程序启动的当前目录。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Main {
    public static void main (String[] args) {
        System.out.println("PATH=" + System.getenv().get("PATH"));
        try {
            Process exec = Runtime.getRuntime().exec("identify image.jpg");
            InputStream is = exec.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            System.out.println(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 

运行上面的代码后你应该得到类似的输出:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
image.jpg JPEG 690x518 690x518+0+0 8-bit sRGB 152KB 0.000u 0:00.000

第一行显示您现在运行的 Java 应用程序的 PATH。 第二个输出行来自identify image.jpg

注意:我运行的是 Mac OS X 10.8.2 和 MacPorts 2.1.3


注意:在 Mac OS X 10.8 之前,有一种方法可以通过使用 ~/.MacOSX/environment.plist 的用户群为用户设置全局变量。但从 Mountain Lion(又名 Mac OS X 10.8)开始,这不再有效。详情可以在这里查看:

【讨论】:

  • 我尝试了您的解决方案。第一个不起作用,尽管我在 aunchd.conf 中设置它并且 System.getenv().get("PATH") 中的 sys 是 /opt/local/bin:/opt/local/sbin:/ usr/bin:/bin:/usr/sbin:/sbin
  • @Odelya 您指的是“第一个”或更好的哪个解决方案对您不起作用?如果您的意思是转储 PATH 环境变量,请注意 System.getEnv() 从 Java 5 (JDK 1.5.0) 开始首先被 Sun 弃用。那么你使用的是哪个 JDK (java -version)?
  • 在 aunchd.conf 文件中设置值后,问题就像在接受的答案中一样 - 我必须将它明确添加到图像魔法的路径参数中。可能在代码中的某个地方有人更改它
  • @Odelya 只是好奇,你现在两次错误地命名它aunchd.conf,但你知道它叫/etc/launchd.conf NOT aunchd.conf /etc/launchd.conf 时在文件名前面喜欢Linda?这可以解释为什么它不适合你。
  • 我不小心错过了。我的意思是launchd.conf
【解决方案2】:

尝试将搜索路径设置为目标目录:

import org.im4java.process.ProcessStarter;
ProcessStarter.setGlobalSearchPath("/opt/local/bin");

【讨论】:

    【解决方案3】:

    我假设 Java 程序不是从 shell 启动的,或者不是作为另一个用户启动的(在后一种情况下,我的回答将无济于事)。对于 MacOS 10.8 也是如此,正如 Uwe 指出的那样,这种方法在那里不起作用(详见 cmets)。

    当程序从 shell 以外的地方启动时,在 shell 配置脚本中设置的环境变量如 profilebashrc 显然不可用。要为这些应用程序设置环境变量,请使用主目录中的文件 .MacOSX/environment.plist。 要创建文件,您需要使用 shell,然后使用 Xcode 附带的属性列表编辑器打开它,并将 PATH 变量设置为所需的值。有关详细信息,请查看 Apple 的文档:Mac Developer Library: User Session Environment Variables

    以下是environment.plist 文件内容的示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>LSCOLORS</key>
            <string>gxfxcxdxbxegedabagacad</string>
            <key>PATH</key>
            <string>/usr/local/bin:/usr/local/sbin:/usr/X11/bin:/usr/local/share/python</string>
       </dict>
    </plist>
    

    【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多