异常:在Java中解析命令行参数时出现org.apache.commons.cli.MissingOptionException

时间:2018-05-23 06:41:38

标签: java

我有一个jar,它对数据库的所有源系统中的所有表执行一些验证。在所有源系统中,表每四个小时加载一次。有时我想对特定源系统的表进行验证,而不是为所有源运行jar,因此我想在运行jar时添加从参数发送源系统名称的选项。到目前为止,这是我提出的代码:

public static void main(String[] args) throws SQLException, IOException, AddressException, InterruptedException {
    GpHiveRecords brge;
    Options options = new Options();
    Option input = new Option("s", "ssn", true, "source system names");
    input.setRequired(true);
    options.addOption(input);
    CommandLineParser parser = new DefaultParser();
    HelpFormatter formatter = new HelpFormatter();
    CommandLine cmd = null;
    try {
        cmd = parser.parse(options, args);
        if (cmd.hasOption("s")) {
            String sources = cmd.getOptionValue("s");
            if (sources == null) {
                System.out.println("Please enter the source system names to perform the Recon..");
            } else {
                brge = new GpHiveRecords(sources);
                brge.createReconFile();
            }
        } else {
            brge = new GpHiveRecords();
            brge.createReconFile();
        }
    } catch (ParseException e) {
        formatter.printHelp("utility-name", options);
        e.printStackTrace();
        System.exit(1);
        return;
    } catch (Exception e) {
        e.printStackTrace();
    }

如果我在命令中使用所需的参数,那么应该是:

java -Xdebug -Dsun.security.abc2.debug=true -Djava.security.abc2.conf=/etc/abc2.conf -Djava.security.abc2.realm=PRODEV.COM -Djava.security.abc2.kdc=ip-00-000-000-000.ab3.internal -Djavax.security.auth.useSubjectCredsOnly=false -jar /home/supusr/AutoVal/AutoVal_Dev.jar --s oracle, sap

由于我没有在我的另一个类中编写逻辑来验证从CLI发送的源,我已经在上面的代码中绕过了这个条件,在'if-else条件'中如果没有' - -s或--ssn'在提交jar时。

if (cmd.hasOption("s")) {
            String sources = cmd.getOptionValue("s");
            if (sources == null) {
                System.out.println("Please enter the source system names to perform the Recon..");
            } else {
                brge = new GpHiveRecords(sources);
                brge.createReconFile();
            }
        } else {
            brge = new GpHiveRecords();
            brge.createReconFile();
        }
}

但是当我按照以下方式提交jar时:

java -Xdebug -Dsun.security.abc2.debug=true -Djava.security.abc2.conf=/etc/abc2.conf -Djava.security.abc2.realm=PRODEV.COM -Djava.security.abc2.kdc=ip-00-000-000-000.ab3.internal -Djavax.security.auth.useSubjectCredsOnly=false -jar /home/supusr/AutoVal/AutoVal_Dev.jar

usage: utility-name
 -s,--ssn <arg>   source system names
org.apache.commons.cli.MissingOptionException: Missing required option: s
        at org.apache.commons.cli.DefaultParser.checkRequiredOptions(DefaultParser.java:199)
        at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:130)
        at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:76)
        at org.apache.commons.cli.DefaultParser.parse(DefaultParser.java:60)
        at com.recordcount.entry.StartCount.main(StartCount.java:31)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)

我从以下代码获得了代码:http://commons.apache.org/cli

有谁能让我知道我在这里做的错误是什么?

1 个答案:

答案 0 :(得分:1)

您已设置:

Option input = new Option("s", "ssn", true, "source system names");
input.setRequired(true);

即。你告诉Commons CLI这个参数是必需的。因此,您收到“Missing required option”错误消息。

如果是可选的,请将其更改为:

input.setRequired(false);