args4j:在“使用”中如何手动排序选项?

时间:2011-11-10 20:16:12

标签: java

在args4j中,我定义了类似的选项:

@Option(name="-host",usage="host to connect")
@Option(name="-port",usage="port of the host")
@Option(name="-idle",usage="idle")

但是,当显示帮助时,args4j始终按字母顺序使用,以便打印

-host - host to connect
-idle - idle
-port - port to connect

这不方便,因为我想首先显示强制选项。此外,我想自己设置选项的顺序,因为一些选项(如主机和端口)应该一起使用。

如何控制args4j中选项的顺序?

我在3年前发现了同样的问题,但没有回答http://markmail.org/message/xce6vitw6miywtos

3 个答案:

答案 0 :(得分:6)

您可以通过ParserProperties设置排序,然后在CmdLineParser构造函数中使用它。如果将OptionSorter设置为null,则将保留选项顺序:

ParserProperties properties = ParserProperties.defaults();
properties.withOptionSorter(null);
CmdLineParser parser = new CmdLineParser(YOUR_OPTIONS_CLASS, properties);

所以在问题的例子中你会得到:

-host - host to connect
-port - port to connect
-idle - idle

答案 1 :(得分:2)

你不能使用当前的Args4j(至少据我所知) - 但由于它是开源的,我鼓励你自己实现它并尝试在新的版本的源代码中获得补丁。

从来源:org.kohsuke.args4j.CmdLineParser

    // for display purposes, we like the arguments in argument order, but the options in    alphabetical order
     Collections.sort(options, new Comparator<OptionHandler>() {
        public int compare(OptionHandler o1, OptionHandler o2) {
            return o1.option.toString().compareTo(o2.option.toString());
        } 
    });

答案 2 :(得分:0)

这个问题在3年后仍未解决。但有一种解决方法。

由于CmdLineParser使用列表来存储选项,而列表由getOptions()公开,因此您可以自行获取列表并对其进行排序。因为列表仅在构造函数中排序。您可以在构建CmdLineParser之后随时对其进行排序。然后输出printUsage()的输出。

此解决方法取决于CmdLineParser的实现,因此它不是一个很好的示例。但作为一种解决方法,它至少在当前版本(2.0.28)上有效。