Apache Commons CLI - 选项类型和默认值

发布于 2024-10-31 08:09:42 字数 188 浏览 2 评论 0原文

如何为 CLI 选项指定类型 - 例如 intInteger? (稍后,如何通过单个函数调用获取解析值?)

如何为 CLI 选项指定默认值?这样 CommandLine.getOptionValue() 或上面提到的函数调用会返回该值,除非在命令行上指定了该值?

How can I give a CLI Option a type - such as int or Integer? (Later, how can I get the parsed value with a single function call?)

How can I give a CLI Option a default value? Such that CommandLine.getOptionValue() or the function call mentioned above return that value unless one is specified on the command line?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

熊抱啵儿 2024-11-07 08:09:42

编辑:现在支持默认值。请参阅下面的答案 https://stackoverflow.com/a/14309108/1082541

正如 Brent Worden 已经提到的,不支持默认值。

我在使用 Option.setType 时也遇到了问题。在对 Integer.class 类型的选项调用 getParsedOptionValue 时,我总是遇到空指针异常。因为文档并没有多大帮助,所以我查看了源代码。

查看 TypeHandler 类和 PatternOptionBuilder 类您可以看到 Number.class 必须用于 int整数

这是一个简单的示例:

CommandLineParser cmdLineParser = new PosixParser();

Options options = new Options();
options.addOption(OptionBuilder.withLongOpt("integer-option")
                      .withDescription("description")
                      .withType(Number.class)
                      .hasArg()
                      .withArgName("argname")
                      .create());

try {
    CommandLine cmdLine = cmdLineParser.parse(options, args);

    int value = 0; // initialize to some meaningful default value
    if (cmdLine.hasOption("integer-option")) {
        value = ((Number)cmdLine.getParsedOptionValue("integer-option")).intValue();
    }

    System.out.println(value);
} catch (ParseException e) {
    e.printStackTrace();
}

请记住,如果提供的数字不适合 int,则 value 可能会溢出。

EDIT: Default values are now supported. See answer https://stackoverflow.com/a/14309108/1082541 below.

As Brent Worden already mentioned, default values are not supported.

I had issues with using Option.setType too. I always got a null pointer exception when calling getParsedOptionValue on an option with type Integer.class. Because the documentation was not really helpful I looked into the source code.

Looking at the TypeHandler class and the PatternOptionBuilder class you can see that Number.class must be used for int or Integer.

And here is a simple example:

CommandLineParser cmdLineParser = new PosixParser();

Options options = new Options();
options.addOption(OptionBuilder.withLongOpt("integer-option")
                      .withDescription("description")
                      .withType(Number.class)
                      .hasArg()
                      .withArgName("argname")
                      .create());

try {
    CommandLine cmdLine = cmdLineParser.parse(options, args);

    int value = 0; // initialize to some meaningful default value
    if (cmdLine.hasOption("integer-option")) {
        value = ((Number)cmdLine.getParsedOptionValue("integer-option")).intValue();
    }

    System.out.println(value);
} catch (ParseException e) {
    e.printStackTrace();
}

Keep in mind that value can overflow if a number is provided which does not fit into an int.

烂人 2024-11-07 08:09:42

我不知道是否不起作用或最近添加,但 getOptionValue() 一个接受默认(字符串)值的重载版本

I do not know if not working or if added recently but getOptionValue() has an overloaded version that accepts a default (String) value

流年里的时光 2024-11-07 08:09:42

OptionBuilder 在 1.3 版和 1.3 版中已弃用。 1.4 和 Option.Builder 似乎没有直接设置类型的函数。 Option 类有一个名为 setType 的函数。您可以使用函数 CommandLine.getParsedOptionValue 检索转换后的值。
不知道为什么它不再是构建器的一部分。现在需要一些像这样的代码:

    options = new Options();

    Option minOpt = Option.builder("min").hasArg().build();
    minOpt.setType(Number.class);
    options.addOption(minOpt);

并读取它:

    String testInput = "-min 14";
    String[] splitInput = testInput.split("\\s+");

    CommandLine cmd =  CLparser.parse(options, splitInput);
    System.out.println(cmd.getParsedOptionValue("min")); 

这将给出一个 Long 类型的变量

The OptionBuilder is deprecated in version 1.3 & 1.4 and Option.Builder doesn't seem to have a direct function to set the type. There is a function for the Option class called setType. You can a retrieve a converted value with the function CommandLine.getParsedOptionValue.
Not sure why it's not part of the builder anymore. It requires some code like this now:

    options = new Options();

    Option minOpt = Option.builder("min").hasArg().build();
    minOpt.setType(Number.class);
    options.addOption(minOpt);

and reading it:

    String testInput = "-min 14";
    String[] splitInput = testInput.split("\\s+");

    CommandLine cmd =  CLparser.parse(options, splitInput);
    System.out.println(cmd.getParsedOptionValue("min")); 

which would give a variable of type Long

铃予 2024-11-07 08:09:42

CLI 不支持默认值。任何未设置的选项都会导致 getOptionValue 返回 null

您可以使用 Option.setType 方法并使用 CommandLine.getParsedOptionValue

CLI does not support default values. Any unset option results in getOptionValue returning null.

You can specify option types using the Option.setType method and extract the parsed option value as that type using CommandLine.getParsedOptionValue

叹梦 2024-11-07 08:09:42

人们可以使用 的其他定义

getOptionValue:
public String getOptionValue(String opt, String defaultValue)

并将默认值包装为字符串。

示例:

String checkbox = line.getOptionValue("cb", String.valueOf(false));

输出: false

它对我有用

One can use other definition of

getOptionValue:
public String getOptionValue(String opt, String defaultValue)

and wrap your default value to string.

Example:

String checkbox = line.getOptionValue("cb", String.valueOf(false));

output: false

it worked for me

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文