どのように私はpicocliでエラーを処理することができますか?

Okumo:

私は自分のCLIを実装しようと私のコマンドの引数を解析するためpicocliを使用したいです。私はすべてのコンソールに書き込みにpicocliをしたくない理由です。だから私は、クラスを作成しMyCommand、いくつかのオプションやパラメータの注釈とともに。今、私はこのような何かを行うことができるようにしたいです:

val myCommand = CommandLine.populateCommand(MyCommand(), args)
myCommand.execute();
val output = myCommand.getOutput();
val errors: List<String> = myCommand.getErrors();

そこ最初の3行には問題ありませんが、私は第四に対処する方法がわかりません。今、populateCommandちょうどすべての例外をスローし、スローされた例外は、私のパイプラインの計算を停止しますので、それらをキャッチすることは、オプションではありません。Picocliのドキュメントには、中に格納される例外についてはパーサー緩いモードを使用することを示唆しているParseResultが、それは私が使用しなければならないことを意味commandLine.parseWithHandlers私のニーズのために使用するのは難しいです方法を。
私何か不足していますか?たぶん私は使用することができ敷居populateCommandと、いくつかの場所に保管例外がありますか?
ここでは、例外のいずれかのスタックトレースですpopulateCommandスローは:

Exception in thread "main" picocli.CommandLine$MissingParameterException: Missing required parameter for option '-A' (<afterContext>)
    at picocli.CommandLine$Interpreter.assertNoMissingParameters(CommandLine.java:8059)
    at picocli.CommandLine$Interpreter.applyOption(CommandLine.java:7534)
    at picocli.CommandLine$Interpreter.processStandaloneOption(CommandLine.java:7446)
    at picocli.CommandLine$Interpreter.processArguments(CommandLine.java:7355)
    at picocli.CommandLine$Interpreter.parse(CommandLine.java:7226)
    at picocli.CommandLine$Interpreter.parse(CommandLine.java:7116)
    at picocli.CommandLine.parse(CommandLine.java:824)
    at picocli.CommandLine.populateCommand(CommandLine.java:777)
Remkoクラウゼン:

解析エラーを無視することは珍しいですが、あなた自身の作成する際に役立ちますインタラクティブ CLIコンソールを単一のコマンドとは反対に、。私の答えは、これはあなたの心に持っているものとみなされます。

ひとつのアイデアは、使用することですparseArgs代わりの方法をpopulateCommand方法。このメソッドは戻りますParseResult、あなたが厳密に行うパーサを設定した場合、解析中に発生したpicocliエラーを得ることができ、そこからが。

例えば:

val myCommand = MyCommand();
val commandLine = CommandLine(myCommand);

// tell parser to be lenient 
commandLine.getCommandSpec().parser().collectErrors(true);

// parse user input, query result for errors 
val parseResult = commandLine.parseArgs(args); 
val parseErrors: List<Exception> = parseResult.errors();

// ignoring the errors for now...
myCommand.execute();
val output = myCommand.getOutput();
val appErrors: List<String> = myCommand.getErrors();

そこにあればことを注意されている任意の解析エラーは、この手段ユーザーが無効な入力を指定していること。その結果、あなたのコマンドが正しく初期化されていない可能性があります。executeこの方法のニーズは、部分的に初期化のオプション/位置パラメータに対処するために、余分な堅牢されるように。

ヒント:あなたがあなた自身の作成している場合、対話型(単一のコマンドではなく)CLIコンソールを、あなたがに興味がある可能性がありJLine 2(Javaの5以上が必要です)またはJLine 3(Javaの8以上が必要です)。Picocliが提供picocli -シェルjline2picocli -シェルjline3有するモジュールPicocliJLineCompleterことを示すコンテキストセンシティブpicocliコマンドの終了候補を。(各モジュールのREADME例を有する。)使用picocliは、それらのコマンドおよびオプションのハンドコード終了者にそのコマンドを不要に定義することアプリケーション。(これの初期のバージョンがで使用されているMicronaut CLI。)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=215733&siteId=1