我在Mac OS X上使用ImageMagick
(10.7)。我在MacPorts
的帮助下安装了它。
当我现在进入终端并写下:
identify image.jpg
它工作得很好。
但是现在从Java中执行它时,会抛出以下异常:
org.im4java.core.CommandException: java.io.FileNotFoundException: identify
我可以通过运行:{/ p>在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根本没有在identify
中找到PATH
?
答案 0 :(得分:6)
与here for OS X 10.8和here 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)开始,这已经不再适用了。详情可在此处查看:
答案 1 :(得分:2)
尝试将搜索路径设置为目标目录:
import org.im4java.process.ProcessStarter;
ProcessStarter.setGlobalSearchPath("/opt/local/bin");
答案 2 :(得分:1)
我认为Java程序不是从shell启动的,或者是作为另一个用户启动的(在后一种情况下,我的回答无济于事)。对于MacOS 10.8也是如此,这种方法在那里不起作用,正如Uwe所指出的那样(详见评论)。
当程序从shell以外的其他位置启动时,profile
或bashrc
等shell配置脚本中设置的环境变量显然不可用。要为这些应用程序设置环境变量,请使用主目录中的文件.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>