107

Java プロジェクトの開発、コンパイル、実行には Eclipse IDE を使用しています。java.io.Console今日は、このクラスを使用して出力を管理し、さらに重要なことにユーザー入力を管理しようとしています。

問題は、アプリケーションが Eclipse を「介して」実行されるとSystem.console()返されることです。nullEclipse は、使い慣れたコンソール ウィンドウを使用したトップレベル プロセスではなく、バックグラウンド プロセスでプログラムを実行します。

Eclipse にプログラムを最上位プロセスとして強制的に実行させる方法、または少なくとも JVM が認識するコンソールを作成する方法はありますか? そうしないと、プロジェクトを jar ファイルにして、Eclipse の外部のコマンドライン環境で実行する必要があります。

4

10 に答える 10

50

Eclipse からステップスルー デバッグを使用できるようにしたいと考えています。ビルドされたクラスを JRE クラスパスの bin ディレクトリに設定することで、クラスを外部で実行することができます。

java -cp workspace\p1\bin;workspace\p2\bin foo.Main

リモート デバッガーを使用して、プロジェクトに組み込まれたクラス ファイルを利用してデバッグできます。

この例では、Eclipse プロジェクトの構造は次のようになります。

workspace\project\
                 \.classpath
                 \.project
                 \debug.bat
                 \bin\Main.class
                 \src\Main.java

1. JVM コンソールをデバッグ モードで起動します。

debug.batは、 cmd.exeコンソールから外部で実行する必要がある Windows バッチ ファイルです。

@ECHO OFF
SET A_PORT=8787
SET A_DBG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=%A_PORT%,server=y,suspend=y
java.exe %A_DBG% -cp .\bin Main

引数では、デバッグ ポートが8787に設定されています。suspend=y引数は、デバッガーがアタッチされるまで待機するように JVM に指示します。

2.デバッグ起動構成を作成する

Eclipse で、[デバッグ] ダイアログを開き ([実行] > [デバッグ ダイアログを開く...]) 、次の設定で新しいリモート Java アプリケーション構成を作成します。

  • プロジェクト:あなたのプロジェクト名
  • 接続タイプ:スタンダード(ソケットアタッチ)
  • ホスト:ローカルホスト
  • ポート: 8787

3. デバッグ

したがって、アプリをデバッグする必要があるときはいつでも次のことを行う必要があります。

  • ブレークポイントを設定する
  • コンソールでバッチ ファイルを起動する
  • デバッグ構成を起動します

この問題はバグ 122429で追跡できます。こちら で説明されているように、抽象化レイヤーを使用して、アプリケーションでこの問題を回避できます。

于 2008-09-19T20:37:36.253 に答える
34

私が使用する回避策は、Eclipse を使用する場合、コンソールの代わりに System.in/System.out を使用することです。たとえば、次の代わりに:

String line = System.console().readLine();

以下を使用できます。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();
于 2010-12-20T16:54:14.990 に答える
5

クラスは自分で実装できます。次に例を示します。

public class Console {
    BufferedReader br;
    PrintStream ps;

    public Console(){
        br = new BufferedReader(new InputStreamReader(System.in));
        ps = System.out;
    }

    public String readLine(String out){
        ps.format(out);
        try{
            return br.readLine();
        }catch(IOException e)
        {
            return null;
        }
    }
    public PrintStream format(String format, Object...objects){
        return ps.format(format, objects);
    }
}
于 2013-03-21T04:22:13.387 に答える
5

これが発生する理由は、Eclipse がアプリをバックグラウンド プロセスとして実行し、システム コンソールのトップレベル プロセスとして実行しないためです。

于 2008-09-19T18:40:06.800 に答える
4

もう 1 つのオプションは、両方のオプションをラップするメソッドを作成し、コンソールが使用できない場合に System.in メソッドに "フェールオーバー" することです。以下の例はかなり基本的なものです。同じプロセスに従って、必要に応じてコンソールの他のメソッド (readPassword、format) をまとめることができます。そうすれば、Eclipse で問題なく実行でき、デプロイするとコンソール機能 (パスワードの非表示など) が起動します。

    private static String readLine(String prompt) {
        String line = null;
        Console c = System.console();
        if (c != null) {
             line = c.readLine(prompt);
        } else {
            System.out.print(prompt);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            try {
                 line = bufferedReader.readLine();
            } catch (IOException e) { 
                //Ignore    
            }
        }
        return line;
    }
于 2012-08-17T01:46:58.683 に答える
4

http://www.stupidjavatricks.com/?p=43でこれについて何かを見つけました。

そして悲しいことに、console は final であるため、それを拡張して system.in と system.out の周りにラッパーを作成することもできません。Eclipse コンソール内でも、それらにアクセスできます。それがおそらく、Eclipseがまだこれをコンソールに接続していない理由です...

System.console 以外の方法でセッターなしでコンソールを取得したくない理由は理解できますが、誰かがクラスをオーバーライドしてモック/テスト コンソール...

于 2008-09-19T18:49:07.683 に答える
2

私の知る限り、Eclipse から Console オブジェクトを取得する方法はありません。コンソールが != null であることを確認してから、JAR を作成してコマンド ラインから実行します。

于 2008-09-19T18:37:41.377 に答える
1

このリンクは、System.console() を使用する代替手段を提供します。1 つは System.in にラップされた BufferedReader を使用する方法で、2 つ目は System.in にラップされた Scanner を使用する方法です。

どちらもコンソールほど簡潔ではありませんが、どちらも eclipse で動作し、愚かなデバッグに頼る必要はありません!

于 2012-07-11T11:05:27.197 に答える
1

Eclipse を介してアプリケーションを実行する場合、java.io.Console オブジェクトを取得する方法がないようです。バックグラウンド プロセス (Eclipse のバックグラウンド?) として実行されるため、アプリケーションではコマンドライン コンソール ウィンドウは開かれません。現在、主に java.io.Console が最終クラスであるため、この問題を処理する Eclipse プラグインはありません。

実際にできることは、返された Console オブジェクトの null をテストし、そこから続行することだけです。

于 2008-09-19T18:56:36.540 に答える