readLine
ユーザーから入力/新しいパスワードを取得するために ofを使用しBufferedReader
ていましたが、パスワードをマスクしたかったので、java.io.Console
クラスを使用しようとしています。問題は、アプリケーションが Eclipse でデバッグされるときにSystem.console()
返されることです。null
私は Java と Eclipse を初めて使用しますが、これが最善の方法であるかどうかわかりません。ソース ファイルを右クリックし、[Debug As] > [Java Application] を選択します。回避策はありますか?
13 に答える
これは日食のバグ#122429です
このコードスニペットはトリックを実行する必要があります:
private String readLine(String format, Object... args) throws IOException {
if (System.console() != null) {
return System.console().readLine(format, args);
}
System.out.print(String.format(format, args));
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
return reader.readLine();
}
private char[] readPassword(String format, Object... args)
throws IOException {
if (System.console() != null)
return System.console().readPassword(format, args);
return this.readLine(format, args).toCharArray();
}
Eclipseでテストしている間、パスワード入力は明確に表示されます。少なくとも、テストできるようになります。テスト中は実際のパスワードを入力しないでください。本番用に保管してください;)。
System.console()
コンソールがない場合はnullを返します。
これを回避するには、コードに間接層を追加するか、外部コンソールでコードを実行してリモートデバッガーを接続します。
APIによると:
「仮想マシンが、標準入力および出力ストリームをリダイレクトせずに対話型コマンド ラインから起動された場合、そのコンソールは存在し、通常、仮想マシンが起動されたキーボードとディスプレイに接続されます。仮想マシンが起動された場合たとえば、バックグラウンド ジョブ スケジューラによって自動的に実行される場合、通常、コンソールはありません。」
ドキュメントによると:
たとえば、バックグラウンドジョブスケジューラによって仮想マシンが自動的に起動される場合、通常、仮想マシンにはコンソールがありません。
Eclipseの実行構成では、コンソールを割り当てるかどうかを構成できると思います。これがチェックされていることを確認してください。(Eclipseを使用してからしばらく経ちましたので、恐れている具体的な指示を与えることはできません)。
それが機能しない場合は、この仕事を確実に実行する何かが、アプリケーションをデバッグモードで起動してから、Eclipseを使用してプロセスに接続することです。これを行う方法がわからない場合は、「Eclipseリモートデバッグ」を検索してください。
さらに、一般に、コンソールの割り当てを要求することはお勧めできません。これは、先ほど発見したように、アプリケーションの柔軟性に大きな影響を与えるためです。Javaを呼び出す多くの方法ではコンソールが割り当てられず、これらのインスタンスではアプリケーションを使用できません(これは悪いことです)。あるいは、コマンドラインで引数を指定できるようにすることもできます。(コンソール入力を具体的にテストしている場合は十分に公平ですが、スクリプトやヘッドレスサーバーからアプリケーションを呼び出すことができると便利な可能性があるため、この種の柔軟な設計はほとんどの場合良い考えです。多くの場合、より適切に編成されたコードにつながります。)
そうです。
Eclipse の外部でアプリケーションを実行する必要があります。Eclipse 内のランチャー構成パネルを見て、別の JVM でコマンドを実行するというオプションを見つけることができるかどうかを確認してください。
プログラムの引数に-consoleを追加して、OSGi コンソールを起動します。