jCommander - 抛出未知和未使用值的异常?

时间:2015-12-03 10:40:35

标签: java annotations command-line-interface jcommander

我正在与JCommander 1.48合作,我遇到了以下问题:

例如,我有这些参数:

@Parameter(names = "user", description = "the User")
private String user;
@Parameter(names = "password", description = "the password")
private String password

我正在使用以下参数运行我的程序:

--user hugo --password secret

--user hugo david --password secret

它们都是相同的解决方案,程序运行完美。但是如果参数的值太多,我希望程序抛出异常。我知道" arity"(参数的值的数量)作为@Parameter注释的配置,但是Strings的arity的默认值是1。似乎一切都在第一个值之后被忽略,只要它不是另一个参数。

任何解决方案或想法?

编辑:

基本解决方案(由assylias发布)对我不起作用。更准确的例子:

public class MyTestProgram {
    private final Params options;
    public MyTestProgram(String[] args) {
        options = new Params();
        new JCommander(options).parse("--user hugo david --password secret".split(" "));
        //pass "args" to parse() instead of hardcoded string.
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("org.jboss.logging.provider", "slf4j");
        new MyTestProgram(args);
    }
}

public class Params {
    @Parameter
    private List<String> parameters = new ArrayList<>();
    @Parameter(names = "--user", description = "the user", required = true)
    private String webuser;
    @Parameter(names = "--password", description = "the password", required = true)

    private String stage;
    //getters and setters
}

这是在实际程序代码开始之前发生的所有事情。

编辑:assylias更新的答案解决了问题。

2 个答案:

答案 0 :(得分:2)

以下程序会根据您的要求抛出异常:

class Params {
  @Parameter(names = "--user", description = "the User")
  String user;
  @Parameter(names = "--password", description = "the password")
  String password;

}

public static void main(String[] args) {
  Params p = new Params();
  new JCommander(p).parse("--user hugo  david --password secret".split(" "));
  System.out.println(p.user);
  System.out.println(p.password);
}

如果删除david,程序会按预期打印hugo和secret。

更新

在你发布的代码中,你有这个:

@Parameter
private List<String> parameters = new ArrayList<>();

如果您阅读javadoc for the names attribute of the Parameter annotation,您会看到(强调我的):

  

一系列允许的命令行参数(例如&#34; -d&#34;,&#34; - outputdir&#34;等...)。 如果省略此属性,则其注释的字段将获得所有未解析的选项

所以命令&#34;大卫&#34;最终在parameters列表中。如果您想要一个例外,则需要删除该参数。

答案 1 :(得分:0)

根据JCommander文档,您可以添加自定义参数验证,例如:

public class SingleValue implements IParameterValidator {
 public void validate(String name, String value) throws ParameterException {
    String[] values = value.split(" ");
    if (values.length > 1) 
    {
      throw new ParameterException("Parameter " + name + " should hold no more than one value, (found " + value +")");
    }
  }
}

那么你的变量声明就像:

@Parameter(names = "user", description = "the User", validateWidth = SingleValue.class)
private String user;

当“--user hugo david --password secret”被传递时,应该抛出异常,但是当“--user hugo --password secret”被传递时不会抛出异常