2

シェルからは機能するがJavaからは機能しない単純なコマンドを実行したいと思います。これは私が実行したいコマンドであり、正常に機能します。

soffice -headless "-accept=socket,host=localhost,port=8100;urp;" 

これは、このコマンドを実行しようとしてJavaから実行しているコードです。

String[] commands = new String[] {"soffice","-headless","\"-accept=socket,host=localhost,port=8100;urp;\""};
Process process = Runtime.getRuntime().exec(commands)
int code = process.waitFor();
if(code == 0)
    System.out.println("Commands executed successfully");

このプログラムを実行すると、「コマンドが正常に実行されました」というメッセージが表示されます。ただし、プログラムの終了時にプロセスは実行されていません。プログラムの実行後にJVMがプログラムを強制終了する可能性はありますか?

なぜこれが機能しないのですか?

4

4 に答える 4

2

私が間違っていないかどうかはわかりませんが、私が見る限り、コマンドを生成していますが、それらを「実行」メソッドに渡すことはありません...「」を実行しています。

Runtime.getRuntime().exec(commands) =) を使用してみてください

于 2008-12-18T16:42:50.707 に答える
0

"/Applications/OpenOffice.org\ 2.4.app/Contents/MacOS/soffice.bin -headless -nofirststartwizard -accept='socket,host=localhost,port=8100;urp;StartOffice.Service'"

または単に引用符をエスケープするだけでも機能します。このようなコマンドを ant スクリプトにフィードすると、最終的に上記のような exec 呼び出しになります。また、500 回程度の変換ごとにプロセスを再起動することをお勧めします。これは、OOO が適切にメモリを解放しないためです (実行しているバージョンによって異なります)。

于 2009-02-19T01:06:52.367 に答える
0

引用を正しく処理していないと思います。元の sh コマンド ラインには、シェルがセミコロンを解釈しないように二重引用符が含まれています。soffice プロセスがそれらを見る前に、シェルはそれらを取り除きます。

Java コードでは、シェルは引数を認識しないため、追加の二重引用符 (バックスラッシュでエスケープ) は必要ありません。

余分な引用符を取り除いた (そしてセミコロンを挿入した) コードを次に示します。

String[] commands = new String[] {"soffice","-headless","-accept=socket,host=localhost,port=8100;urp;"};
Process process = Runtime.getRuntime().exec(commands);
int code = process.waitFor();
if(code == 0) 
    System.out.println("Commands executed successfully");

(免責事項: 私は Java を知りません。また、これをテストしていません!)

于 2009-02-18T04:19:10.697 に答える