JLine と ConsoleUI を備えた対話型 Java コンソール

ブログ

ホームページホームページ / ブログ / JLine と ConsoleUI を備えた対話型 Java コンソール

May 01, 2024

JLine と ConsoleUI を備えた対話型 Java コンソール

マシュー・タイソン著、InfoWorld | ソフトウェア アーキテクトコマンドライン インターフェイス (CLI) は、ソフトウェア開発の内部世界です。 シェルから、すべてのオペレーティング システムに直接アクセスできます。

マシュー・タイソン著

ソフトウェアアーキテクト、InfoWorld |

コマンドライン インターフェイス (CLI) は、ソフトウェア開発の内部世界です。 シェルからオペレーティング システムのすべての機能に直接アクセスできるため、ソフトウェアのあらゆる側面を構成および調整する機能が得られます。 多くのツールやフレームワークにはコマンド ラインが組み込まれています。 それだけでなく、コマンド プロンプトはソフトウェア システムを操作するための根本的な魔法です。 それはほぼ無限の可能性の家です。

この記事では、Java での高度なインタラクティブ コマンドライン インターフェイス (CLI) アプリケーションと REPL (読み取り、評価、印刷ループ、またはインタラクティブ シェル) の構築について説明します。 Java で基本的なデモ アプリケーションをセットアップし、JLine ライブラリと ConsoleUI ライブラリを使用して必要な機能を追加します。

私たちのデモンストレーションは、ソフトウェア プロジェクトの作業ディレクトリを調べ、そこにあるプロジェクトに関する情報を収集する理論的なアプリケーションに基づいています。 アプリケーションはディレクトリ内に新しいプロジェクトを作成することもできます。 サンプル アプリケーションは、タブ補完可能な 2 つのコマンド、describe および create を受け入れる REPL を開始します。 description コマンドは、作業ディレクトリのフォルダー階層を色分けして (必要に応じてページングを使用して) リストします。一方、create は、作成するプロジェクトの種類 (Java、JavaScript、または Python) をユーザーが選択できる対話型メニューを開始します。 Java アプリケーションの場合、ユーザーが追加できる追加機能 (データベースまたは REST API) を複数選択して、ネストされたメニューを表示できるようにします。

これらの機能を実際に実装するのではなく、JLine の機能を調べるためにのみ使用します。

このツアーでは、Java JDK と Maven がインストールされている必要があります。 まず、リスト 1 に示すような、Maven アーキタイプを使用して新しいアプリケーションを作成します。

Maven はこれらのコマンドを使用して新しいプロジェクトをレイアウトします。 さらに先に進む前に、リスト 2 で行ったように、必要な依存関係をすべて追加し、Java バージョンを 11 に設定しましょう (Java 8 以降のどのバージョンでも動作するはずです)。これは pom に適用されます。プロジェクト ルートの .xml ファイル (残りの pom.xml はそのままにしておきます)。

次に、src/main/java/com/infoworld/App.java のメイン クラスを変更して、REPL ループを開始しましょう。 リスト 3 のコードを使用して App.java を変更します。

リスト 3 は、ユーザー入力の行を監視し、それをエコーバックする非常に単純なプログラムを作成します。 これに、サポートする 2 つのコマンド、説明、作成を保持する「コンプリーター」を追加しました。 つまり、ユーザーがプロンプトに入力しているときに、Tab キーを押してこれらのコマンドを完了できるということです。 Tab を 2 回押すと、使用可能なコマンドを含むメニューが表示されます。 JLine は、流暢なスタイルの .completer(new StringsCompleter("describe", "create")) メソッド呼び出しを使用して、これを非常に簡単にしました。 JLine には String に加えていくつかの組み込みコンプリーターがあり、独自のコンプリーターを構築することもできます。

基本的に、REPL は無限の while ループであり、ユーザーが exit に入ると中断されます。

リスト 4 に示す Maven exec:java コマンドを実行してテストできます。

キャロット プロンプト、エコー応答、タブ補完コマンドが表示されます。

echo REPL がオートコンプリートで動作するようになったので、実際にコマンドを処理してみましょう。 これは、コマンドで入力された文字列を比較し、それぞれのメソッドを呼び出すことによって、一般的な Java で実行します。 現時点では、create は何も行いませんが、リスト 5 に示すように、ディレクトリ階層を出力するロジックを実装します。

アプリケーションを実行するときに、describe コマンドを入力すると、作業ディレクトリのインデント形式のリストが表示されます。 この文字列を構築する作業は getDirectoryHierarchy() で行われます。 このメソッドは、java.nio.file パッケージの通常の Java を使用してディレクトリを探索し、各ファイルとディレクトリを出力し、下に進むディレクトリの各レベルにスペースをインデントします。 この作業は主に path.relativeize(p).getNameCount() で行われます。これは、現在のパス (.) から現在のパス (./src/main/java など) への相対パスを返します。 getNameCount() は、そのパス内の名前の数 (この場合は 3 つ) をカウントするだけです。 それぞれの名前にスペースを追加します。