javaから外部コマンドの起動がうまくいかない件

| トラックバック(0)

どうも。

なんだかeclipseのプラグインにはまっております。ハシモトです。

javaから外部コマンドを呼び出す際に、そのコマンドがデフォルトのPATHに入っていない場合、API上ではProcessクラスのexecメソッドの引数に環境変数を渡せる仕様になっていますが、実はPATHはここで設定しても通りません。以下のようなコードでも

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Test {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Runtime r = Runtime.getRuntime();
        Process p = r.exec("tree", new String[]{"PATH=/opt/local/bin/:$PATH;"});
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}

結果は。

Exception in thread "main" java.io.IOException: Cannot run program "tree": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:470)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:431)
    at java.lang.Runtime.exec(Runtime.java:369)
    at Test.main(Test.java:12)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:53)
    at java.lang.ProcessImpl.start(ProcessImpl.java:91)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
    ... 4 more

ということなのでどうするかというと。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Test {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Runtime r = Runtime.getRuntime();
        Process p = r.exec(new String[]{"env", "PATH=/opt/local/bin/:$PATH;", "tree"});

        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}

ワンライナーコマンドの中でenvコマンドで一緒に指定してしまう、という解決策。ちなみにexportはなぜか見つからなかった。which exportとかやっても見つからず。そもそもコマンドなんですかね?

ではでは。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: javaから外部コマンドの起動がうまくいかない件

このブログ記事に対するトラックバックURL: http://blog.chrhsmt.com/mt-tb.cgi/482