Java コマンドライン インターフェイス (パート 5):JewelCli
以前の投稿で Apache Commons CLI、args4j、jbock、および Commandline を使用した Java でのコマンドライン処理を見た後、この投稿では、Java でコマンドライン引数の同様の処理を行うために JewelCli を使用することに注意を向けます。
いくつかの Java コマンド行処理ライブラリーは、注釈を使用してコマンド行オプションを定義します。これまでにこの一連の投稿で取り上げた 4 つのライブラリのうち 3 つがアノテーションを使用しており、JewelCli も同様です。これまで取り上げてきたライブラリの中で、JewelCli はユニークです。そのアノテーションは、Java クラスやクラスの構造体ではなく、Java インターフェースに適用されるからです。次のコード リストは、Java インターフェースでアノテーションを使用して、JewelCli でコマンドライン解析の「定義」段階を実装する方法を示しています。
注釈付きインターフェースで実装されたJewelCli「定義」
package examples.dustin.commandline.jewelcli; import com.lexicalscope.jewel.cli.Option; /** * Interface defining JewelCli-friendly command-line parameters. */ public interface MainCommandLine { @Option(shortName="f", description="Name and path of file to be used.") String getFile(); @Option(shortName="v", description="Indicate whether status should be reported verbosely.") boolean isVerbose(); @Option(helpRequest=true, description="Usage details on command-line arguments.") boolean getHelp(); }
上記の単純なインターフェースには、コマンドライン処理に関連する多くの機能が含まれています。オプションには、shortName
で明示的に指定された単一ハイフンの短い名前があります 注釈型要素であり、「get」メソッドの名前を介して暗黙的に指定されます (ただし longName
アノテーション タイプ要素は、スイッチのロング ネーム [ダブル ハイフン] バージョンを明示的に指定するために使用できます)。コマンドライン オプションには、Option
を介して提供されるそれぞれの説明もあります。 注釈。 helpRequest=true
の使用 使用法/ヘルプ情報を表示するために使用する必要があるコマンド ライン スイッチについて説明します。この場合、アノテーション メソッドの名前が getHelp()
であるためです。 、--help
スイッチは使用情報を表示します。メソッドに getDustin()
という名前を付けていたら @Option(helpRequest=true)
で注釈を付けました 、スイッチは --dustin
になります 使用状況を表示します。
JewelCli は、メソッド名と一致するスイッチの長い名前以外の場合に、構成よりも規則を利用します。上記のように注釈が付けられたコマンドライン オプションの対応するインターフェイス メソッド定義を使用すると、詳細スイッチ (これは boolean
を返します) ) はオプションです。対応する getFile()
のため、ファイル名スイッチが必要です。 メソッドは String
を返します .ファイル名をオプションにしたい場合は、 defaultValue
を指定できます @Option
に getFile()
の注釈 @Option(defaultValue="")
などのメソッド .
インターフェイス (MainCommandLine
という名前) この場合) JewelCli @Option
で注釈 アノテーション、JewelCli を使用した「解析」段階に進むことができます。これは、Main
の次のコード リストで、「尋問」段階とともに示されています。 .
JewelCli を使用した「解析」および「尋問」段階
package examples.dustin.commandline.jewelcli; import static java.lang.System.out; import com.lexicalscope.jewel.cli.CliFactory; /** * Demonstrates use of JewelCli for parsing command-line * parameters in Java. */ public class Main { public static void main(final String[] arguments) { final MainCommandLine main = CliFactory.parseArguments(MainCommandLine.class, arguments); out.println("You specified file '" + main.getFile() + "' with verbosity setting of '" + main.isVerbose() + "'."); } }
Main
先ほど示したクラスには、「解析」する行が 1 つあります [CliFactory.parseArguments(Class<T>, String...)
の呼び出し] ] と、「問い合わせ」を行う 1 行 [前述の JewelCli アノテーション付きインターフェースで定義されたメソッドにアクセスする行] です。
次の 3 つの画面のスナップショットは、動作中の JewelCli ベースのコード例を示しています。最初の画像は --help
の使用を示しています 使用法を確認します (出力にスタック トレースが含まれていることに注意してください)。 2 番目の画像は、long (-
) のさまざまな組み合わせを示しています。 ) および短い (--
) オプションスイッチ。 3 番目の画像は、必要なコマンドライン引数 (--file
または -f
この場合) は提供されません。
この記事で使用した両方のクラスのコード リストは、JewelCli のアプリケーションを示すために GitHub で入手できます。
Java でのコマンドライン解析に役立つライブラリを選択する際に考慮すべき、JewelCli のその他の特性を次に示します。
- JewelCli はオープン ソースであり、Apache ソフトウェア ライセンス バージョン 2 に基づいてライセンス供与されています。
- 現在のJewelCli (0.8.9) JAR (
jewelcli-0.8.9.jar
/ 2014 年 2 月) のサイズは約 542 KB です。 - JewelCli を使用するために追加のライブラリは必要ありません。
- 上記の例に示されているように、JewelCli は「定義」段階で Java インターフェースのアノテーションを使用します。同様の方法でクラスの「get」メソッドに注釈を付けようとすると、実行時に「IllegalArgumentException:… is not an interface」などのメッセージが表示されます。
- ただし、JewelCli は、インターフェイスの「get」メソッドではなく、クラスの「set」メソッドに注釈が付けられる代替のクラス/インスタンス ベースのアプローチをサポートしています。
- JewelCli では、インターフェイスがスーパー インターフェイスと
@Option
から継承できます。 親インターフェースで定義された s は、継承インターフェースでサポートされます。 - インターフェイスで注釈が付けられたメソッドの戻りデータ型は、コマンドライン オプションの値の型強制を提供します。列挙型を戻りデータ型として使用して、考えられるコマンドライン オプションの型を有限の可能性のセットに絞り込むこともできます。
JewelCli は使いやすく、構成アプローチよりも慣例のおかげで、コマンドライン引数の定義、解析、および問い合わせに必要なコードはほとんどありません。解析可能なコマンドライン オプションを定義するためにインターフェイスに注釈を付けるという推奨されるアプローチは、見た目にも美しいと思います。
その他のリソース
- ジュエルクリ
- GitHub の JewelCli
- Maven上のJewelCli
- JewelCliの使い方紹介
- JewelCli ドキュメント/ブログ
- JewelCLI:Java 用のシンプルな CLI インターフェース
- JewelCli:代替案、レビュー、ブログ投稿、およびユーザー