車輪を再発明しないために、私は完成したライブラリーを取ることにしました。 commons-cliを選択しましたが、いくつかの例を見つけることができましたが、使用方法はそれほど複雑ではないようでした。
判明したように、例はそれほど多くなく、開発者の基本的なニーズのみをカバーしています。 このギャップを説明で埋めようとします。
それでは始めましょう。 Commons-cliは、オプションの概念に基づいています。 すぐに明確にするために、用語を決定してみましょう。 次の行を検討してください。
Text.exe –l login ––password 123456
test.exeプログラムは、lオプションを使用して呼び出されます。lオプションは、文字列「login」を引数として使用し、passwordオプションを使用して、引数を文字列「123456」として使用します。 プログラムが認証を必要とし、lオプションがログインを担当し、passwordオプション自体がパスワードであると推測するのは簡単です。 簡単にするために、古典的な方法「パラメーター=値」で「オプション、引数」のペアを検討できます。
ちなみに、commons-cliを使用する場合、「=」記号が付いたエントリフォームはまったく問題ありません。
オプションは引数なしでも、複数の引数があってもかまいません。 オプション名が1文字で構成されている場合、先頭に「-」が付きます(単純な「ダッシュ」を付けて呼び出しましょう)。 オプション名が2文字以上で構成されている場合、パスワードオプションと同様に、ダッシュを2倍にする必要があります。
用語を整理すると、コードに直接アクセスできます。 そのため、すべてオプションから始まります。 オプションを作成します。
Option option = new Option("l", "login", true, "Login");
この場合、cosstructorは4つのパラメーターを取ります:オプションの短い形式(1文字オプション)、オプションの長い形式、パラメーターの存在を示すフラグ、およびこのオプションのテキスト説明。 オプションの1文字表記またはオプションの拡張表記のみを指定できます。これらの各場合、コンストラクターは3つのパラメーターを取りますが、複数文字または1文字のオプションを指定することはできません。少なくとも1つ指定する必要があります。 次に、このオプションが引数でどのように機能するかを決定する必要があります。 このようなもの:
option.setArgs(1); // option.setOptionalArg(false);// , , option.setArgName("login ");// , .
コードに関するコメントからすべてが明らかになるはずです。 引数なしのオプション(フラグオプション)が必要な場合は、setArgs(0)を設定します。 オプションを作成したら、それをOptionsオブジェクトに追加します。
Options posixOptions = new Options(); posixOptions.addOption(option);
ここで、コマンドラインパーサーを作成し、動作に必要な情報を提供する必要があります。
CommandLineParser cmdLinePosixParser = new PosixParser();// Posix CommandLine commandLine = cmdLinePosixParser.parse(posixOptions, commandLineArguments);//
最初に、commons-cli 2のフルウェイトパーサーであるパーサー、PosixパーサーとGNUパーサーを作成します。 率直に言って、私はそれらの違いには触れませんでしたが、すぐに見て、Posixパーサー( Posix標準で規制され、それぞれこの標準をサポートするすべてのシステムで動作します)が好きになりました。 、実際には起動時にプログラムに渡されたパラメーターのある行(標準のargs []配列は使用前にスペースで要素を区切る1行で結合する必要があることは言うまでもありません) 解析の結果は、commandLineオブジェクトに返されます。
これで、受信したコマンドを実行する必要があります。これは次のように行われます。
if (commandLine.hasOption(“l”)) { // , l, , l String[] arguments = commandLine.getOptionValues(“l”);// , System.out.println("We try to Login with: " + arguments[0]);// … // }
ご覧のとおり、commons-cliの操作は非常に簡単です。 さらに、このライブラリーは、プログラムの使用に関するヘルプを完全にではなく提供しますが、次のことを容易にします。
public static void printHelp( final Options options, final int printedRowWidth, final String header, final String footer, final int spacesBeforeOption, final int spacesBeforeOptionDescription, final boolean displayUsage, final OutputStream out) { final String commandLineSyntax = "java test.jar";// final PrintWriter writer = new PrintWriter(out);// help final HelpFormatter helpFormatter = new HelpFormatter();// help` helpFormatter.printHelp( writer, printedRowWidth, commandLineSyntax, header, options, spacesBeforeOption, spacesBeforeOptionDescription, footer, displayUsage);// writer.flush(); // }
すべてを明確にするために、このメソッドを呼び出す例を示します。
printHelp( posixOptions, // help 80, // "Options", // "-- HELP --", // 3, // 5, // true, // usage System.out // );
ここでは、「使用文字列」という用語を除いて、すべてが明確になっている可能性があります。 このパラメーターの使用方法が明らかになる例を、例を挙げて説明します。 trueの場合、出力は次のようになります。
使用法:java test.jar [-l] [-h]
falseの場合、出力は次のようになります。
使用法:java test.jar
その違いは明らかだと思います。
後者はオプションのグループです。 たとえば、2つのオプション-aと-bがあります。これらは相互に排他的です。つまり、同時に指定することはできません。 この場合、オプションのグループが作成されます:
OptionGroup optionGroup = new OptionGroup(); optionGroup.addOption(new Option("a", true, "A option"); optionGroup.addOption(new Option("b", true, "B option"); posixOptions.addOptionGroup(optionGroup);
すべても非常に簡単です。
一般的に、ライブラリは使用に関して良い印象を残しましたが、すぐに見落とされ始めました。 ライブラリ1.2の現在のバージョン、完全に新しいバージョン2.0の開発-実際、apiバージョン2.0の説明によれば、このバージョンはcliライブラリのほとんどの要件を満たす必要があると言えます。
commons-cliの長所:
- 使いやすさ
- オプショングループ
- 長いオプション表記と短いオプション表記(-l、-login)
- 次の形式のオプションを解析する機能-ab、2つのオプションがある場合-a、-b
短所(あなた自身のニーズから、そしてもちろん他にもあります):
- サブコマンドを作成する方法はありません(gitにはブランチ、ステータスなどのコマンドとオプションがあります)
- オプション引数が1つ以上ある場合、あまり便利ではありません
その結果、シンプルなCLI-優れたソリューション、代替案を探すか、バージョン2.0を待つより深刻な何かのために。
記事内のリンク:
UPD。 プロンプトで、 nord_uaはPosixコマンドライン標準へのリンクを修正しました。
タイプミスを修正し、commons-cliへのリンクを追加しました。 nik_lazarevとFractalizeRに感謝します。