私が書いているアプリケーションで、Runtime.exec(...) を使用して別のアプリケーション (実行可能な JAR) を起動しています。Windowsではすべてが正常に起動しますが、Linux(特にCentOSの特定のインストール-Ubuntuで動作)ではいくつかの問題が発生しています。何らかの理由で、セカンダリ アプリケーションが正常に起動する唯一の方法は、最初のアプリケーションをターミナルから実行することです。すべての動作は期待どおりに機能します。ただし、(ターミナルを開かずに) アイコンをダブルクリックして最初のアプリケーションを起動すると、2 番目のアプリケーションを起動するボタンは何もしないようです。例外やエラー出力は表示されません。進行状況バーが起動中であることを示すだけで、何も表示されません。2 番目のアプリケーションのプロセスが起動されていないことを jconsole で確認できます。
exec メソッドの落とし穴に関する一般的にリンクされている記事 ( http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html ) を見たことがありますが、これを解決できませんでした。私がそこで見つけたものに問題があります。実際、2 番目のプロセスの出力ストリームとエラー ストリームを読み取っています。これは、2 番目のプロセスが正常に実行されたときにすべての出力が表示されるためです (端末コマンドを使用して最初のアプリケーションを起動した後)。Linux のより深い仕組みについてよく知らないので、これは出力ストリームのパーミッションの問題か何かのように聞こえると思いますが、よくわかりません。
問題の診断に役立つ場合は、次のコマンドを使用します。
rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."});
これは機能するため (アプリケーションの起動方法によって異なります)、このコードに問題があることはあまり心配していません...
誰にも提案はありますか?前もって感謝します!
編集: 解決策は、実行しようとしていた JAR にディレクトリを修正することでした。GUI から起動するとuser.dir
、アプリケーションを含むフォルダーの親ディレクトリを指していました。私は Eclipse RCP を使用しているので、私の解決策は
String currDirPath = Platform.getInstallLocation().getURL().toString();
代わりに使用することでした。みんな助けてくれてありがとう!