2

現在、Apache の共通 CLI ライブラリを使用してコマンド ライン オプションを解析していますが、条件付きの要件を簡単に処理できる方法はないかと考えていました。

たとえば、以下の例では、2 つの必須オプション-a-bオプションの があり-h、説明を表示する必要があります。パーサーが現在動作する方法は、必要なオプションの 1 つが欠落している場合はいつでも ParserException をスローすることを期待するというものです。ここまでは順調ですね。-h私の質問は、が指定されているときに必要なオプションを検索しない方法があるかどうかです。これ-hは、ヘルプのみを出力し、実際にアプリを起動しないのが一般的であるため、他のコマンド ライン オプションのチェックをスキップしたいと思います。

import org.apache.commons.cli.*;

public class MyClass {

    ...

    public static void main(String[] parameters)
    {
        Options options = new Options();

        Option opt_a = Option.builder("a")
                .argName("A Option")
                .required(true)
                .longOpt("a-option")
                .desc("First option")
                .build();

        Option opt_b = Option.builder("b")
                .argName("B Option")
                .required(true)
                .longOpt("b-option")
                .desc("Second option")
                .build();

        Option opt_h = Option.builder("h")
                .argName("Help")
                .longOpt("help")
                .desc("Shows this help")
                .build();

        options.addOption(opt_a);
        options.addOption(opt_b);
        options.addOption(opt_h);

        CommandLineParser parser = new DefaultParser();

        try {
            CommandLine cmd = parser.parse(options, args);
            ...
        } catch (ParseException e) {
            System.err.println("Error parsing command line options");
            System.err.println(e.getMessage());
            usage(options);
            System.exit(1);
        }
    }

    public static void usage(Options options) {
        String header = "My application\n\n";
        String footer = "\nPlease report issues at http://github.com/user/repo/issues";

        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp("MyApp", header, options, footer, true);
    }
}
4

1 に答える 1

4

次のように記述されているOptionGroupをおそらく使用できるように見えます。

相互に排他的なオプションのグループ。

したがって、1 つOptionGroupを自分-hで作成し、もう 1 つを他のすべてのオプションで作成します。OptionGroup次に、両方の sを追加します。


追加した

一部の調査では、複数回の解析試行を使用することが提案されています。

        Options mainOptions = new Options();

        Option opt_a = Option.builder("a")
                .argName("A Option")
                .required(true)
                .longOpt("a-option")
                .desc("First option")
                .build();

        Option opt_b = Option.builder("b")
                .argName("B Option")
                .required(true)
                .longOpt("b-option")
                .desc("Second option")
                .build();
        mainOptions.addOption(opt_a);
        mainOptions.addOption(opt_b);

        Options helpOptions = new Options();
        Option opt_h = Option.builder("h")
                .argName("Help")
                .longOpt("help")
                .desc("Shows this help")
                .build();
        helpOptions.addOption(opt_h);
        CommandLineParser parser = new DefaultParser();
        try {
            CommandLine cmds = parser.parse(helpOptions, args, true);
            // have they specified a help option?
            if (cmds.getOptions().length == 0) {
                // No! Try normal options.
                cmds = parser.parse(mainOptions, args);
            } else {
                // They specified a help option.
            }
            //...
        } catch (ParseException e) {
            System.err.println("Error parsing command line options");
            System.err.println(e.getMessage());
            System.exit(1);
        }
于 2015-07-13T15:34:44.783 に答える