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

Dej*_*ell 4 java macos path imagemagick identify

ImageMagick在Mac OS X(10.7)上使用.我是在帮助下安装的MacPorts.

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

identify image.jpg
Run Code Online (Sandbox Code Playgroud)

它工作得非常好.

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

org.im4java.core.CommandException: java.io.FileNotFoundException: identify
Run Code Online (Sandbox Code Playgroud)

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

which identify
Run Code Online (Sandbox Code Playgroud)

回复:

/opt/local/bin/identify
Run Code Online (Sandbox Code Playgroud)

现在运行时:

echo $PATH
Run Code Online (Sandbox Code Playgroud)

我收到了回复:

/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
Run Code Online (Sandbox Code Playgroud)

相同的代码在Windows上ImageMagick也可以完美地运行.

那么,为什么im4java没有找到identifyPATH呢?

Uwe*_*her 6

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

每默认情况下,PATH应用程序IST设置/usr/bin:/bin:/usr/sbin:/sbin,即使你不是有一个/etc/launchd.conf在所有.

所以你必须在终端中执行以下操作:

sudo vi /etc/launchd.conf
Run Code Online (Sandbox Code Playgroud)

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

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

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

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

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

还有第二种解决方案,如果您从像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();
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

第一个输出行显示您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)开始,这已经不再适用了.详情可在此处查看: