picocli CLI 解析器:在呈现输出时隐藏 Java 变量名称

picocli CLI parser: hide the Java variable name while rendering the output

我正在使用 picocli 来展示我的命令行应用程序的用法。 我无法达到的是隐藏出现在打印输出中的 Java 变量的名称,从我的角度来看,它看起来很丑陋。

这是我的配置 CommandLine.Option:

@CommandLine.Option(
        names = {"-a", "--abc"},
        description = "Please, hide the Java variable name...")
private String xxx;

这是它的渲染方式:

-a, --abc=<xxx>   Please, hide the Java variable name...

如您所见,Java 变量的名称出现在等号之后:<xxx>

我想隐藏它,像这样:

-a, --abc   Please, hide the Java variable name...

我检查了 API 但我看不到任何与此相关的内容。 有什么方法可以关闭它吗?

picocli 注释 API 没有为此提供,但可以通过覆盖帮助 API 并插入您自己的选项渲染器来实现。例如:

public class HideOptionParams {

@Option(names = {"-u", "--user"}, defaultValue = "${user.name}",
        description = "The connecting user name.")
private String user;

@Option(names = {"-p", "--password"}, interactive = true,
        description = "Password for the user.")
private String password;

@Option(names = {"-o", "--port"}, defaultValue = "12345",
        description = "Listening port, default is ${DEFAULT-VALUE}.")
private int port;

public static void main(String[] args) {
    CommandLine cmd = new CommandLine(new HideOptionParams());
    cmd.setHelpFactory(new IHelpFactory() {
        public Help create(final CommandSpec commandSpec, ColorScheme colorScheme) {
            return new Help(commandSpec, colorScheme) {
                @Override
                public IOptionRenderer createDefaultOptionRenderer() {
                    return new IOptionRenderer() {
                        public Text[][] render(OptionSpec option,
                                               IParamLabelRenderer ignored,
                                               ColorScheme scheme) {
                            return makeOptionList(option, scheme);
                        }
                    };
                }
            };
        }
    });
    cmd.usage(System.out);
}

private static Text[][] makeOptionList(OptionSpec option, ColorScheme scheme) {
    String shortOption = option.shortestName(); // assumes every option has a short option
    String longOption = option.longestName(); // assumes every option has a short and a long option

    if (option.negatable()) { // ok to omit if you don't have negatable options
        INegatableOptionTransformer transformer =
                option.command().negatableOptionTransformer();
        shortOption = transformer.makeSynopsis(shortOption, option.command());
        longOption = transformer.makeSynopsis(longOption, option.command());
    }

    // assume one line of description text (may contain embedded %n line separators)
    String[] description = option.description();
    Text[] descriptionFirstLines = scheme.text(description[0]).splitLines();

    Text EMPTY = Ansi.OFF.text("");
    List<Text[]> result = new ArrayList<Text[]>();
    result.add(new Text[]{
            scheme.optionText(String.valueOf(
                    option.command().usageMessage().requiredOptionMarker())),
            scheme.optionText(shortOption),
            scheme.text(","), // we assume every option has a short and a long name
            scheme.optionText(longOption), // just the option name without parameter
            descriptionFirstLines[0]});
    for (int i = 1; i < descriptionFirstLines.length; i++) {
        result.add(new Text[]{EMPTY, EMPTY, EMPTY, EMPTY, descriptionFirstLines[i]});
    }
    // if @Command(showDefaultValues = true) was set, append line with default value
    if (option.command().usageMessage().showDefaultValues()) {
        Text defaultValue = scheme.text("  Default: " + option.defaultValueString(true));
        result.add(new Text[]{EMPTY, EMPTY, EMPTY, EMPTY, defaultValue});
    }
    return result.toArray(new Text[result.size()][]);
}
}

这显示了以下使用帮助消息:

Usage: <main class> [-p] [-o=<port>] [-u=<user>]
  -o, --port          Listening port, default is 12345.
  -p, --password      Password for the user.
  -u, --user          The connecting user name.

请注意,选项列表中省略了参数标签,但仍显示在概要中。如果您不想在概要中显示任何参数标签,您可以在 @Command 注释中指定一个 custom synopsis,请参阅用户手册中的此部分。