1

Java クラスのRuntime.exec関数を使用して、別の jar から実行可能な jar を実行しようとしています。
コードは

Runtime r = Runtime.getRuntime();
Process p = r.exec("java -jar \""+_JarPath +"\" "  + "\""+ args[0]+"\""+ " " +"\""+ args[1]+"\""+ " " +"\""+ args[2]+"\"" + " " +"\""+ args[3]+"\"");

ここで、引数argsは null ではなく、明確に定義されています。

このコードは Windows プラットフォームでは問題なく動作しますが、Linux ではエラーが発生します

jar ファイル "/opt/mydir/lib/MyFol/mytest.jar" にアクセスできません

私は他の同様の質問を読み、それを確認しました

  1. ディレクトリ/opt/mydir/lib/MyFol/とファイルmytest.jarにはすべての権限があります
  2. このプロセス コマンドが起動される実行可能 jar にも、すべての権限があります。
  3. Linux のユーザーも管理者です

LinuxでOpenJDKを使用しています。

4

2 に答える 2

5

上記の Linux マシン上のコードの実際の問題は二重引用符でした。Robin Green がpostで述べているように、彼は正しいです。
しかし、パスに空のスペースが含まれていたり、他の引数の間にスペースが含まれていたりすると、jar を実行できませんでした。
そのためには、jar をロードする別の方法を試す必要がありました。これは、両方のプラットフォームでシームレスに機能し、スペースの問題も削除されました。この状況では、
プロセスビルダーが助けになりました。

ProcessBuilder pb = new ProcessBuilder("java", "-jar", _JarPath, args[0], args[1], args[2], args[3]);
Process p = pb.start();

これは、すべての状況で、プローブなしで両方のプラットフォームで正常に機能しました。

EDIT
OOPS簡単な解決策がありましたが、私はそれを手に入れませんでした.Ingoコメントに感謝します.exec

Runtime r = Runtime.getRuntime();
Process p =null;
String[] cmdarray = new String[7];
cmdarray[0] = "java";
cmdarray[1] = "-jar";
cmdarray[2] = _JarPath;                 
cmdarray[3] = args[0];
cmdarray[4] = args[1];
cmdarray[5] = args[2];
cmdarray[6] = args[3];
p = r.exec(cmdarray);
于 2013-11-12T14:20:57.073 に答える
2

二重引用符なしで試してください。シェルが呼び出されていないことが問題であると思われますが、Java が直接呼び出されています。

于 2013-11-09T08:41:19.457 に答える