4

ImageMagick在 Mac OS X (10.7) 上使用。我在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 根本找不到identifyPATH

4

3 回答 3

6

就像这里针对 OS X 10.8这里针对 OS X 10.7所描述的一样,唯一完整的解决方案是将您PATH/etc/launchd.conf.

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

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

sudo vi /etc/launchd.conf

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

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

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

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

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

还有第二种解决方案,如果您从 Eclipse 之类的 IDE 中启动程序,您也可以在那里设置 PATH。在 Eclipse 中,您可以通过Run | Run Configurations | EnvironmentJava 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

第一个输出行显示您PATH现在运行的 Java 应用程序。第二条输出线来自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)开始,这不再有效。详情可以在这里查看:

于 2013-03-06T20:35:24.733 回答
2

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

import org.im4java.process.ProcessStarter;
ProcessStarter.setGlobalSearchPath("/opt/local/bin");
于 2013-03-04T17:05:14.587 回答
1

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

当程序从 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>
于 2013-03-09T17:13:55.887 回答