21

GnuParser で Apache Commons CLI を使用して処理されるコマンド ライン引数を取る Java アプリケーションを作成しています。入り込むのが面白くない理由から、ParseException をスローする代わりに、不明なコマンド ライン オプションを黙って無視したいのですが、それを行う方法がわかりません。GnuParser.parse() に stopAtNonOption ブール値オプションがあることがわかりますが、不明なトークンに遭遇した後もオプションを処理し続ける ignoreAtNonOption のようなものが必要です。

これを達成するために独自のパーサーを実装することもできましたが、この機能が組み込まれていないことに驚いたので、その道を進む前に確認したいと思いました。

私が話していることのコード例:

try {
  CommandLine commandLine = parser.parse(options, args);
  // stopAtNonOption set to true (below) is also not what I want
  // CommandLine commandLine = parser.parse(options, args, true);
} catch (ParseException e) {
  LOG.error("error parsing arguments", e);
  throw new RuntimeException(e);
}
4

4 に答える 4

29

これは私にとってはうまくいきます(他のパーサーも派生できます):

public class ExtendedGnuParser extends GnuParser {

    private boolean ignoreUnrecognizedOption;

    public ExtendedGnuParser(final boolean ignoreUnrecognizedOption) {
        this.ignoreUnrecognizedOption = ignoreUnrecognizedOption;
    }

    @Override
    protected void processOption(final String arg, final ListIterator iter) throws     ParseException {
        boolean hasOption = getOptions().hasOption(arg);

        if (hasOption || !ignoreUnrecognizedOption) {
            super.processOption(arg, iter);
        }
    }

}
于 2011-12-23T08:53:11.287 に答える
1

これは Commons CLI では不可能です。ただし、ユースケースの詳細を提供すれば、期待する結果を達成する別の方法があるかもしれません。

于 2011-07-18T08:54:11.277 に答える
0

私は非常に悪い開発者です、そして私はコードを壊すためにこれをします:

public class EasyPosixParser extends PosixParser {
    @Override
    protected void processOption(String arg, ListIterator iter) throws ParseException
    {
        try {
            super.processOption(arg, iter);
        } catch (ParseException e) {
            // do nothing
        }
    }
}

メインコードでは、次のことを行います。

    CommandLineParser commandlineParser = new EasyPosixParser();
于 2011-11-11T06:52:19.390 に答える