4

ImageMagickMac 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 の場合はこちらで説明れているように、唯一の完全な解決策は in を設定することPATHです/etc/launchd.conf

デフォルトでは、がまったくない場合でも、 PATHfor Applications は に設定されています。/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 を再起動する必要があります。

PATH次のコードを使用して、Java アプリケーションで を再現できます。

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

2 番目の解決策があります。Eclipse などの IDE 内からプログラムを起動する場合は、そこで PATH を設定することもできます。Run | Run Configurations | EnvironmentEclipseでは、左側のサイドバーの下にある起動構成を選択しながら、それを行うことができますJava Application

私は次のコードでそれを再現し、別名、Java アプリが起動された現在のディレクトリにimage.jpg配置しました。${user.dir}

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 アプリケーションが表示されます。2 番目の出力行は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 プログラムはシェルから、または別のユーザーとして開始されていないと仮定します (後者の場合、私の回答は役に立ちません)。同じことが MacOS 10.8 にも当てはまります。Uwe が指摘したように、この方法はそこでは機能しません (詳細についてはコメントを参照してください)。

プログラムがシェル以外の場所から開始された場合、シェル構成スクリプトで設定された環境変数は、profileまたはbashrc明らかに使用できません。これらのアプリケーションの環境変数を設定するに.MacOSX/environment.plistは、ホーム ディレクトリにあるファイルを使用します。ファイルを作成するには、シェルを使用し、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 に答える