25

私はJavaでコマンドラインアプリケーションを書いていますが、私はApache Commons CLIを使って入力引数を解析しました。Commons CLI required groups

私がの2つの必要なオプション(つまり、-inputと-output)を持っているとします。私は新しいOptionオブジェクトを作成し、必要なフラグを設定します。今のところそれはすべていいです。しかし、私は第3番目、必要ないオプションを持っています。 -助けて。私が言及した設定で、ユーザーがヘルプを表示したいとき(-helpオプションを使う)、 "-input and -output"が必要です。これを実装する方法はありますか(Commons CLI API経由で、(!hasOption)が新しいXXXException()をスローする場合は単純ではありません)。

答えて

27

この場合、2つのオプションセットを定義し、コマンドラインを2回解析する必要があります。最初のオプションセットには、必要なグループに先行するオプション(通常は--help--version)が含まれ、2番目のセットにはすべてのオプションが含まれています。

最初のオプションセットを解析することから始めます。一致するものが見つからなければ、2番目のセットに進みます。ここで

は一例です:

Options options1 = new Options(); 
options1.add(OptionsBuilder.withLongOpt("help").create("h")); 
options1.add(OptionsBuilder.withLongOpt("version").create()); 

// this parses the command line but doesn't throw an exception on unknown options 
CommandLine cl = new DefaultParser().parse(options1, args, true); 

if (!cl.getOptions().isEmpty()) { 

    // print the help or the version there. 

} else { 
    OptionGroup group = new OptionGroup(); 
    group.add(OptionsBuilder.withLongOpt("input").hasArg().create("i")); 
    group.add(OptionsBuilder.withLongOpt("output").hasArg().create("o")); 
    group.setRequired(true); 

    Options options2 = new Options(); 
    options2.addOptionGroup(group); 

    // add more options there. 

    try { 
     cl = new DefaultParser().parse(options2, args); 

     // do something useful here. 

    } catch (ParseException e) { 
     // print a meaningful error message here. 
    } 
} 
+0

[OK]をクリックします。しかし、どのように私は試合を見つけていないと言うことができますか? (「一致するものが見つからなければ」)?必要なフラグを設定した場合、ParseExeceptionを取得しますが、使用できないオプションを渡すと、ParseExceptionも発生します:(このケースを区別するにはどうすればよいですか?) – pavel

+0

'commandline.getOptions()' isn ' t empty。 –

+0

Ok。可能な解決策ですが、サポートされていないオプションはどうしたらいいですか?-help、-input、-outputなどのオプションがあります。見つからなかった場合、UnrecognizedOptionExceptionがスローされた場合、2番目のオプションを解析する必要がありますか?それはあなたが提案したものです。助けてくれてありがとうbtw :) – pavel

関連する問題