2012-01-24 7 views
2

を経由してOSDの通知を行いますと、私は、コマンドラインでは、私がここにjavaの</p> <p>を通じてUbuntuので通知バブルにアクセスしようとしていたJava

Exception in thread "main" java.io.IOException: Cannot run program "/usr/bin/notify-send -t 10000 "Hello OSD" "This is my first programmatic OSD notification"": java.io.IOException: error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
    at java.lang.Runtime.exec(Runtime.java:593) 
    at java.lang.Runtime.exec(Runtime.java:466) 
    at TestOSD.main(TestOSD.java:6) 
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:148) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:65) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 
    ... 3 more 
をこのスタックトレースを取得しています私のコード

class TestOSD{ 

public static void main(String[] args) throws Exception{ 
    String[] cmmd = {"/usr/bin/notify-send -t 10000 \"Hello OSD\" \"This is my first programmatic OSD notification\""}; 
    System.out.println("This is said : Hello OSD"); 
    Runtime.getRuntime().exec(cmmd); 
} 
} 

です

基本的に私はランタイムクラスのexec()メソッドのオーバーロードを理解できませんか?誰でもこの点で私を助けることができますか?

答えて

11

私は、文字列全体を開始するプロセスの名前として探しているというのが問題だと思います。代わりにこれを試してください:

String[] cmd = { "/usr/bin/notify-send", 
       "-t", 
       "10000", 
       "Hello OSD This is my first programmatic OSD notification"}; 

これは、プロセスの名前と残りの各引数を区別する必要があります。

+0

これは機能します。どの過負荷が使用されたか?私は何が間違っていたのですか? – prometheuspk

+0

@ Prometheus87:同じオーバーロードを使用していますが、プログラム名*と*コマンドライン引数の両方を含む* 1文字列の配列ではなく、4文字列の配列への参照を渡しています。 –

+2

Jonが上記のようにString [](配列要素ごとに1つのarg)を使用することも、あなたの例で試していたようにすべてのテキストを含むプレーンストリングを使用することもできます。問題は2つのアプローチを組み合わせたことでした。 –

関連する問題