1

別のJavaアプリケーション(Jar)をダウンロードしてappdataに保存するJavaアプリケーションを作成した後、それを実行する必要があり、これも機能します。しかし、2 番目の Jar を実行するために使用する私の Runtime.exec() は、メインの Jar をコンソールから実行した場合にのみ機能します。

String command = "java -jar -Xms" + comboBox.getSelectedItem() + " " 
    + Util.getWorkingDirectory() + File.separator + "zlauncher" 
    + File.separator + "minecraftStarter.jar " + txtUsername.getText() + " " 
    + passwordField.getText() + " " + Util.toString(chckbxRemember.isSelected());
Runtime rt = Runtime.getRuntime();
rt.exec(command);

これをコンソールから起動すると機能しますが、スタンドアロンの Jar として実行すると機能しません。

コンソールを必要とせずに 2 番目の Jar を開始する方法を視覚化する方法を教えてください。

編集: ProcessBuilder でも試してみましたが、同じ結果です。(コンソールで動作しますが、スタンドアロンとしては動作しません)

4

2 に答える 2

3

いくつかのヒント:

ProcessBuilder を使用して別の方法で動作させることができなかったからといって、あきらめて Runtime.exec() を使用する必要があるという意味ではありません。Runtime.exec() は、自明ではないものに使用するのが本当に難しいか不可能の間のどこかにあります。したがって、ProcessBuilder を使用してください。

String を受け取るものではなく、リストを受け取る ProcessBuilder コンストラクターを使用します。文字列を取るものには、Runtime.exec() とまったく同じ問題があります。

可能であれば、Windows の場合はバッチ ファイルを使用し、Linux の場合はシェル スクリプトを使用して、できるだけ多くの作業 (パスの設定など) を行います。コマンドラインでこれをデバッグすると、ProcessBuilder での使用がずっと簡単になります。

環境のシェル (例: cmd /e または /bin/bash、または what-have-you) を呼び出して、シェルにバッチ ファイルを実行させます。

生成されたプロセスから出力ストリームを読み取ることを忘れないでください。そうしないと、子プロセスがロックされる可能性が非常に高くなります。

于 2012-10-01T23:50:15.510 に答える
0

コマンドを String 配列に入れる必要があります。

Runtime rt = Runtime.getRuntime();
rt.exec(new String[] { "java", "-jar", "-Xms", comboBox.getSelectedItem(), Util.getWorkingDirectory() + File.separator + "zlauncher" + File.separator + ""minecraftStarter.jar", txtUsername.getText(), passwordField.getText(), Util.toString(chckbxRemember.isSelected()) });
于 2012-10-02T00:54:21.223 に答える