2

このコマンドをターミナルで実行する必要があるバイナリ実行可能ファイル (ソースコードなし) があります。エクスポート LD_LIBRARY_PATH = "" を使用して、ディレクトリにあるライブラリ lbtiff.so.3 にリンクします。このエクスポート コマンドを実行した後にのみ、バイナリを実行できます。そうしないと、エラーが発生します - 「共有ライブラリの読み込み中にエラーが発生しました: libtiff.so.3...

ここで、Java コードからこのバイナリを実行したいと思います。ただし、ランタイムで export コマンドを実行するだけでは何も実行されず、Java からバイナリを実行すると「error while ..」エラーが引き続き発生します。UNIX 固有の環境変数 LD_LIBRARY_PATH を Java から設定できない可能性があると思います。Java からバイナリを実行し、ライブラリを見つける方法はありますか? ここに私の現在のコードがあります -

Process p = Runtime.getRuntime().exec("bash -c export LD_LIBRARY_PATH=<lib path>");

p = Runtime.getRuntime().exec("<binary path>");
4

3 に答える 3

5

ではなくRuntime.exec、 を使用しますProcessBuilder。これにより、必要なバイナリを実行するときに環境変数を指定できるようになります

ProcessBuilder pb = new ProcessBuilder("<binarypath>");
pb.environment().put("LD_LIBRARY_PATH", "<libPath>");
Process p = pb.start();

Runtime.exec最初の設定で行った環境設定はその特定Processの にのみ影響し、 の別の呼び出しによって開始された後続のプロセスには影響しないため、 2 つの個別の呼び出しを使用するアプローチは機能しませんRuntime.exec

于 2012-12-03T15:07:18.553 に答える
3

別の質問に対する私の回答を参照してください。最善の方法は、外部シェルを使用して環境変数を設定するのではなく (変数をグローバルに設定せず、bash プロセスに対してのみ設定するため、コードが機能しません)、Java 内から変数を設定することです。はるかに簡単で、機能します (インストールされているシェルに関係なく、すべてのプラットフォームで)。

于 2012-12-03T14:49:00.370 に答える
1

UNIXシステムでは、コマンドを実行する前に変数を先頭に追加できます

LD_LIBRARY_PATH=... foo args

変更を使用してプログラムを実行しfooますargsLD_LIBRARY_PATH

または、次を使用してサブシェルを利用できます。

(export LD_LIBRARY_PATH=...; foo args)
于 2012-12-03T14:15:57.257 に答える