gpt4 book ai didi

Java CLI 解析器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:37 25 4
gpt4 key购买 nike

我知道这个问题已经被问过了,但我正在寻找具有特定功能的 Java cli 解析器。我希望它能够定义命令行树,从而使用子命令(以及不止一个级别的深度)。因此,在我进入选项之前,我可以有 3-4 级命令。而且这些子命令是互斥的。谢谢

最佳答案

可以用JCommander来完成.每个 JCommander 对象本质上都是一个具有任意数量参数和/或任意数量嵌套子命令的命令,其中顶级 JCommander 对象是 root 命令。命令参数始终特定于为其声明的命令,并且不干扰其他命令的参数。添加子命令的界面不是很直观,但是是可能的(参见 addCommand 方法())

这是一个概念验证测试类:

public class Test{

@Test
public void nestedSubCommandTest() {
GeneralOptions generalOpts = new GeneralOptions();
JCommander jc = new JCommander(generalOpts);

Command command = new Command();
JCommander jc_command = addCommand(jc, "command", command);

SubCommand1 subcommand1 = new SubCommand1();
JCommander jc_subcommand1 = addCommand(jc_command, "subcommand1",
subcommand1);

SubCommand2 subcommand2 = new SubCommand2();
JCommander jc_subcommand2 = addCommand(jc_subcommand1, "subcommand2",
subcommand2);

SubCommand3 subcommand3 = new SubCommand3();
addCommand(jc_subcommand2, "subcommand3", subcommand3);

jc.parse("--general-opt",
"command", "--opt",
"subcommand1",
"subcommand2", "--sub-opt2",
"subcommand3", "--sub-opt3");

assertTrue(generalOpts.opt);// --general-opt was set
assertTrue(command.opt);// command --opt was set
assertFalse(subcommand1.opt);// subcommand1 --sub-opt1 was not set
assertTrue(subcommand2.opt);// subcommand2 --sub-opt2 was set
assertTrue(subcommand3.opt);// subcommand3 --sub-opt3 was set
}

private static JCommander addCommand(JCommander parentCommand,
String commandName, Object commandObject) {
parentCommand.addCommand(commandName, commandObject);
return parentCommand.getCommands().get(commandName);
}

public static class GeneralOptions {
@Parameter(names = "--general-opt")
public boolean opt;
}

@Parameters
public static class Command {
@Parameter(names = "--opt")
public boolean opt;
}

@Parameters
public static class SubCommand1 {
@Parameter(names = "--sub-opt1")
public boolean opt;
}

@Parameters
public static class SubCommand2 {
@Parameter(names = "--sub-opt2")
public boolean opt;
}

@Parameters
public static class SubCommand3 {
@Parameter(names = "--sub-opt3")
public boolean opt;
}
}

编辑:如何重用命令。

方案一,使用继承:

  public class CommonArgs{
@Parameter(names="--common-opt")
public boolean isCommonOpt;
}

@Parameters(description = "my command 1")
public class MyCommand1 extends CommonArgs{}

@Parameters(description = "my command 2")
public class MyCommand2 extends CommonArgs{}

我认为这个的用法和行为是显而易见的。一个缺点是您只能从一个类扩展,该类将来可能会限制可重用性。

解决方案 2,使用组合模式(参见 doc here):

  public class CommonArgs{
@Parameter(names="--common-opt")
public boolean isCommonOpt;
}

@Parameters(description = "my command 1")
public class MyCommand1{
@ParametersDelegate
public CommonArgs commonArgs = new CommonArgs();
}

@Parameters(description = "my command 2")
public class MyCommand2{
@ParametersDelegate
public CommonArgs commonArgs = new CommonArgs();
}

在这里,嵌套的commonArgs 类的参数将被视为命令类的直接参数。您可以根据需要添加任意数量的委托(delegate),甚至可以将委托(delegate)嵌套在其他委托(delegate)中等等。要在解析后获取委托(delegate)选项的值,只需执行 myCommand1.commonArgs.isCommonOpt

关于Java CLI 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com