Eclipse IDEでのjava.io.Consoleサポート


103

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

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

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


参照してくださいstackoverflow.com/questions/26470972/...私は識別System.outし、System.in私のユースケースのために十分であるようにして使用してabondaned System.console()
OneWorld 2016

プロジェクトを実行可能なjarとしてエクスポートしましたが、コンソールのnullエラーが引き続き発生します
Abhigyan

回答:


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に設定されています一時停止= yの引数は、デバッガのアタッチされるまで待つようにJVMに指示します。

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

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

  • プロジェクト:プロジェクト名
  • 接続タイプ:標準(ソケット接続)
  • ホスト: localhost
  • ポート: 8787

3.デバッグ

したがって、アプリをデバッグするときに必要なことは次のとおりです。

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

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


1
またpause、バッチファイルの最後にを付けて、閉じる前に点滅するエラーメッセージを確認できるようにします。
Matt Lyons

10
これが最後のわらです。デバッグのためだけにこれらすべてを行う必要がある場合は、Netbeansに切り替えます。Eclipseには多くの未修正のバグとUIの煩わしさがあるため、面白くもありません。
nuzzolilo 2012年

@Nuzzolilo、これはリモートデバッグ用です。あなたはそれなしでEclipseでローカルにデバッグできます。
Laplie Anderson、2014

35

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

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

以下を使用できます。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();

20
そのようにパスワードをマスキングしてパスワードを読むことができるとは思いません。
Sualeh Fatehi

3
...と処理する必要がありIOException、の場合はスローされませんConsole.readLine()
dma_k '25

5

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


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);
    }
}

4

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

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

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


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;
    }

2

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


1

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

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


1

このリンクは、System.console()を使用する代わりに使用できます。1つはSystem.inにラップされたBufferedReaderを使用することで、もう1つはSystem.inにラップされたScannerを使用することです。

どちらもコンソールほど簡潔ではありませんが、どちらもEclipseで機能し、愚かさをデバッグする必要はありません。


0

EclipseワークスペースがC:\ MyWorkspaceであり、MavenプロジェクトMyProject内にJavaアプリケーションを作成し、Javaメインクラスがcom.mydomain.mypackage.MyClassであるとします。

この場合、System.console()コマンドラインで使用するメインクラスを実行できます。

java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass

注意:Mavenプロジェクトにない場合は、プロジェクトのプロパティで出力フォルダーを確認してください。Javaビルドパス| ソース。「ターゲット/クラス」ではない可能性があります

NB2:Mavenプロジェクトであるが、クラスがsrc / test / javaにある場合は、「target \ classes」ではなく「target \ test-classes」を使用する必要があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.