7

だから私はOptions他のオプションの中にあるインスタンスを持っています(に注意してisRequired()ください):

        options.addOption(OptionBuilder
                .withLongOpt("seq1")
                .withDescription("REQUIRED : blah blah")
                .hasArg().isRequired().create());
        options.addOption(OptionBuilder
                .withLongOpt("seq2")
                .withDescription("REQUIRED : blih blih")
                .hasArg().isRequired().create());
        options.addOption(new Option("?", "help", false,
                "print this message and exit"));

を呼び出すと、とが存在しないparser.parse(args)場合に例外がスローされますが、メッセージを出力し、例外がスローされないようにしたいのですが、どうすればよいですか? これにより、NPE が自然にスローされます。seq1seq2line.hasOption("help")

CommandLine line = null;
try {
    CommandLineParser parser = new GnuParser();
    // parse the command line arguments
    line = parser.parse(options, args);
} catch (ParseException e) {
    if (line.hasOption("help")) { //NPE
        usage(0);
    }
    System.err.println("Parsing failed.  Reason: " + e.getMessage());
    usage(1);
}

private static void usage(int exitCode) {
    // automatically generate the help statement
    HelpFormatter formatter = new HelpFormatter();
    formatter.printHelp("Smith Waterman", OPTIONS, true);
    System.exit(exitCode);
}
4

5 に答える 5

7

ここから適応したソリューション

private static final Options OPTIONS = new Options();
private static final Options HELP_OPTIONS = new Options();
OPTIONS.addOption(OptionBuilder
        .withLongOpt("seq1")
        .withArgName("file1")
        .withDescription(
                "REQUIRED : the file containing sequence 1")
        .hasArg().isRequired().create());
// etc
final Option help = new Option("?", "help", false,
        "print this message and exit");
HELP_OPTIONS.addOption(help);
OPTIONS.addOption(help);
// later
CommandLineParser parser = new GnuParser();
CommandLine line = parser.parse(HELP_OPTIONS, args, true); // true so it
// does not throw on unrecognized options
if (line.hasOption("help")) {
    usage(0); // calls exit
}
line = parser.parse(OPTIONS, args);

もっとエレガントなものがあれば、喜んで受け入れます

于 2013-01-16T11:23:56.993 に答える
1

これは、使用法に応じて役立つ場合と役に立たない場合があります。私のは次のとおりです。

  • 私は1つのラッパープログラム(「コントローラー」と呼ばれる)を持っています
  • コントローラが実行できる多くのコマンド(「タスク」と呼ばれる)があります
  • 各コマンドには、独自のコマンドライン引数セットのセットがあります

例えば:

$ controller startall -rsrc foo -dir bar -where baz

引数を使用して最初に行うことは、コマンドが何であるかを判別することです。そのために、最初の引数を調べ、先頭のハイフンをすべて取り除き、それが既知のタスクであるかどうかを確認するTaskFactoryを設定しました。「ヘルプ」タスクがあり、ユーザーは次のことができます。

$ controller -help

$ controller help

各タスクにはヘルプオプションもあるため、ユーザーは次のことができます。

$ controller startall -help

しかし、それはあなたを助けないかもしれません。別の方法を投稿します。

于 2013-01-14T14:59:00.160 に答える
0

あなたが発見したように、Commons CLIはオプション間の依存関係を処理しません。あなたの場合、--helpオプションは と の要件を変更しseq1ますseq2

唯一の本当の解決策は、すべてのオプションを不要にし、コマンドライン解析が完了した後に依存関係の検証を自分で行うことです。

于 2013-01-14T04:33:23.863 に答える
0

選択したパーサーを拡張して、不明なオプションを無視します。

Apache Commons CLI オプションパーサーは不明なコマンドラインオプションを無視できますか?

次に、引数を 2 回解析します。1 回は-help引数用、もう 1 回は通常の引数用です。最初は「無視」フラグを渡す必要があり、2 回目は渡すべきではありません。

あるいは、オプションを 2 回解析し-helpますMissingOptionException

于 2013-01-14T15:15:10.913 に答える