在Mac OS X上,Java Runtime无法在PATH中找到程序

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

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

 identify image.jpg 

它工作得非常好。

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

 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

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

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

就像这里描述的OS X 10.8和OS X 10.7一样 ,唯一完整的解决方案是在/etc/launchd.conf设置PATH

默认情况下,应用程序的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 Run | Run Configurations | EnvironmentJava Application下的左侧栏中选择启动配置时的Run | Run Configurations | Environment

我确实使用以下代码和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)开始,这已经不再适用了。 详细信息可以在这里查看:

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

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

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

     LSCOLORS gxfxcxdxbxegedabagacad PATH /usr/local/bin:/usr/local/sbin:/usr/X11/bin:/usr/local/share/python