2009-07-29 7 views
4

私はJavaでコマンドラインアプリケーションを少し書いて、新しいクラスjava.io.Consoleを使いたいと思っていました。私はSystem.console()を使ってこのクラスのインスタンスを取得します。この呼び出しは、 'java -jar MyApp.jar'を介してアプリケーションを呼び出すと動作するコンソールを返しますが、antのjava-taskを使用してアプリケーションを実行すると設定解除されます。この呼び出しではforkは真でspwanはfalseです。なぜこの違いがあるのですか(System.out.print()はantの下でうまく動作します)?私が蟻を介して私のアプリケーションを起動した場合でも、私はどのようにコンソールを使うことができますか?Javaで実行するとSystem.console()が設定され、ant経由で実行される場合はunsetされるのはなぜですか?

+2

Emacsでこの種のプログラムを起動したときに同じ問題が発生していることに気付きました。 –

答えて

7

this method状態のJavadoc:もしあれば

は、現在のJava仮想マシンに関連付けられた一意のConsoleオブジェクトを返します。

そしてSystem.Consoleクラスの状態のためのドキュメント:

仮想マシンコンソールを持っているかどうかは、基盤となるプラットフォームの際にも仮想マシンが起動される方法に依存しています。標準入出力ストリームをリダイレクトせずに仮想マシンを対話型コマンドラインから起動すると、そのコンソールが存在し、通常は仮想マシンが起動されたキーボードとディスプレイに接続されます。仮想マシンがバックグラウンドジョブスケジューラなどによって自動的に起動される場合、通常はコンソールがありません。

Antが新しいJavaプロセスをフォークすると、標準出力がリダイレクトされると思います。

+0

'System.Console'は実際に役に立つでしょうか?ユーザーがストリームをリダイレクトしないことは期待できません。 –

+0

コンソールに読み書きする細かい機能が必要な場合。おそらく、ある種のcursesのような動作をしている場合です。私はあなたのアプリがヌルであるかどうかをチェックし、出力がリダイレクトされた場合に別のタイプの動作に分岐したいと思うでしょう。 –

+0

btw、「cursesのような行動」と言ったときの言葉:http://en.wikipedia.org/wiki/Curses_(programming_library)とhttp://en.wikipedia.org/wiki/Ncurses –

2

入力または出力がリダイレクトされる場合、System.console()は nullを返します。アントはそれだけです。

1

まあ、antは、ビルドの自動化ツールです。通常、インタラクティブなアプリケーションはビルドの自動化の中ではほとんどまたはまったく存在しないので、antを使ってタスクを実行するときにコンソールを取得しないということはまったく予期しないことではありません。

0

ant javaタスクがjava.exeの代わりにjavaw.exeを使用しているようです。 javawにはコンソールが接続されていません。

関連する問題