【问题标题】:How to use Option class(cli-commons) in java如何在 java 中使用 Option 类(cli-commons)
【发布时间】:2020-03-30 14:32:34
【问题描述】:

我正在使用存在选项类的 cli-commons 1.4 库。我在我的类 CLIReader.java 下创建一个选项类的对象。这是我的代码:

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.log4j.Logger;

public class CLIReader {

private String user = "";
private String password = "";
private String serverUrl = "";
private String streamName = "";
private static String compList;
private static String completeLogger;

public boolean readCommandLineParameters(String[] args) {
Logger log = Logger.getLogger(CLIReader.class);
Options options = new Options();

Option helpOpt = Option.builder("h").longOpt("help").desc("Usage Help").build();
options.addOption(helpOpt);

Option serverurl = Option.builder("url").longOpt("server url").desc("Server url").required().hasArg().argName("url").build();
options.addOption(serverurl);

Option userOpt = Option.builder("u").longOpt("user").desc("User Name").hasArg().argName("user").required().build();
options.addOption(userOpt);

Option pwdOpt = Option.builder("p").longOpt("password").desc("user password").hasArg().argName("password").required().build();
options.addOption(pwdOpt);
Option streamOpt = Option.builder("s").longOpt("streamName").desc("Stream Name").hasArg().argName("streamName").required().build();
options.addOption(streamOpt);

Option configOpt =   Option.builder("c").longOpt("componentList").desc("ComponentListPath").hasArg().argName("compList").required().build();
options.addOption(configOpt);

Option completeLoggerOpt = Option.builder("v").longOpt("completeLogger").desc("Complete Logger Info + Errors").hasArg().argName("yes/no").required().build();
options.addOption(completeLoggerOpt);

try {
  CommandLineParser parser = new DefaultParser();
  CommandLine cmd = parser.parse(options, args, true);

  if (cmd.hasOption("h")) {
    System.out.println("p");
    return false;
  }

  serverUrl = cmd.getOptionValue("url");
  user = cmd.getOptionValue("u");
  password = cmd.getOptionValue("p");
  streamName = cmd.getOptionValue("s");
  compList = cmd.getOptionValue("c");
  completeLogger = cmd.getOptionValue("v").toLowerCase();
}
  catch (Exception e) {
  log.info(e.getMessage());

  HelpFormatter formatter = new HelpFormatter();
  formatter.printHelp("User", options, true);

  return false;
}

return true;
}

public String getUser() {
return user;
}

public String getPassword() {
return password;
}

public String getServerUrl() {
return serverUrl;
}

public String getStreamName() {
return streamName;
}

public String getcompList() {
return compList;
}

public String getcompleteLogger() {
return completeLogger;
}

}

我有两种情况,就是

场景 1

当我在命令行提示符中传递此命令时: java -jar abc.jar -u stack -p stackoverflow91 -url https://www.google.com -s streamA -c D:\abc.txt -v

我得到输出:

INFO - Missing required options: v
usage: abc  -c <compList> [-h] -p <password> -s <streamName>
   -u <user> -url <url> -v <yes/no>
-c,--componentList <compList>   ComponentListPath
-h,--help                       Usage Help
-p,--password <password>        user password
-s,--streamName <streamName>    Stream Name
-u,--user <user>                User Name
-url,--server url <url>         Server url
-v,--completeLogger <yes/no>    Complete Logger Info + Errors

这是正确的,因为缺少v 的值

场景 2

当我在命令行提示符中传递此命令时: java -jar abc.jar -h java -jar abc.jar -help

我得到输出:

INFO - Missing required options:url,s,u,p,c v
usage: abc  -c <compList> [-h] -p <password> -s <streamName>
   -u <user> -url <url> -v <yes/no>
-c,--componentList <compList>   ComponentListPath
-h,--help                       Usage Help
-p,--password <password>        user password
-s,--streamName <streamName>    Stream Name
-u,--user <user>                User Name
-url,--server url <url>         Server url
-v,--completeLogger <yes/no>    Complete Logger Info + Errors

但是我想要的是当我通过这个命令时, java -jar abc.jar -h java -jar abc.jar -help

我希望我的输出为“p”,即 if 条件中的消息。

谁能帮我解决上面代码中我做错了什么?

试用-1

public boolean readCommandLineParameters(String[] args) {
Logger log = Logger.getLogger(CLIReader.class);
Options options = new Options();
boolean hasHelp= false;
Option helpOpt = Option.builder("h").longOpt("help").desc("Usage Help").build();
options.addOption(helpOpt);

Option serverurl = Option.builder("url").longOpt("server url").desc(" Server url").required().hasArg().argName("url").build();
options.addOption(serverurl);

Option userOpt = Option.builder("u").longOpt("user").desc("User Name").hasArg().argName("user").required().build();
options.addOption(userOpt);

Option pwdOpt = Option.builder("p").longOpt("password").desc(" user password").hasArg().argName("password").required().build();
options.addOption(pwdOpt);

//Stream Option added 
Option streamOpt = Option.builder("s").longOpt("streamName").desc("Stream Name").hasArg().argName("streamName").required().build();
options.addOption(streamOpt);

Option configOpt = Option.builder("c").longOpt("componentList").desc("ComponentListPath").hasArg().argName("compList").required().build();
options.addOption(configOpt);

Option completeLoggerOpt = Option.builder("v").longOpt("completeLogger").desc("Complete Logger Info + Errors").hasArg().argName("yes/no").required().build();
options.addOption(completeLoggerOpt);

  try {
  CommandLineParser parser = new DefaultParser();
  CommandLine cmd = parser.parse(options, args, true);
  } 
  if (cmd.hasOption(helpOpt.getOpt()) || cmd.hasOption(helpOpt.getLongOpt()))    {
    System.out.println("yes");
    hasHelp = true;
}

  serverUrl = cmd.getOptionValue("url");
  user = cmd.getOptionValue("u");
  password = cmd.getOptionValue("p");
  streamName = cmd.getOptionValue("s");
  compList = cmd.getOptionValue("c");
  completeLogger = cmd.getOptionValue("v").toLowerCase();
}
catch (Exception e) {
  log.info(e.getMessage());

  HelpFormatter formatter = new HelpFormatter();
 formatter.printHelp("Abc ", options, true);
}

return hasHelp;
}

【问题讨论】:

  • 看到这个问题:Required options contradicts with help option。你遇到了同样的问题。
  • @andrewjames 感谢您的快速支持,但对我没有用
  • 我尝试了相同的代码,但现在结果也一样
  • 好的 - 明白,但我不知道什么是“相同的代码”,或者你是如何使用它的。你能展示你修改后的代码吗?您可以编辑您的问题,或提出一个新问题。
  • @andrewjames 我已经发布了编辑后的代码,请查看tryout-1部分下的代码,谢谢

标签: java command-line


【解决方案1】:

您的“tryout-1”代码仍然遇到原始问题。

原来的问题是这样的:你定义了你的Options对象,然后你用required()给它添加了各种强制选项。现在,无论您做什么都无关紧要 - 只要您尝试单独使用 -h,您的 Options 对象就会抱怨那些缺少的强制选项。

link 我提供了解决此问题的建议方法 - 但您还没有实施任何方法。

正如其中一个答案所述:

我们过去解决这种情况的方法...是对命令行进行两次解析。

创建一个不同的 Options 对象,然后将 -h 添加到其中 - 但仅此而已。首先使用该对象来测试您的命令行。如果命令行包含-h,则打印使用文本。否则,使用主 Commands 对象来处理所有剩余选项的命令行。

这是该方法的一个非常基本的精简版本 - 它需要清理,但说明了这一点:

private String serverUrl = "";

public void readCommandLineParameters(String[] args) {
    // Just the "help" option:
    Options helpOpts = new Options();
    Option helpOpt = Option.builder("h").longOpt("help").desc("Usage Help").build();
    helpOpts.addOption(helpOpt);

    // Everything else:
    Options allOpts = new Options();
    Option serverurl = Option.builder("url").longOpt("server url").required().desc("Server url")
            .hasArg().argName("url").build();
    allOpts.addOption(serverurl);

    boolean hasHelpOption = false;

    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = null;
    try {
        cmd = parser.parse(helpOpts, args, true);
    } catch (ParseException ex) {
        Logger.getLogger(CLIReader.class.getName()).log(Level.SEVERE, null, ex);
    }

    if (cmd.hasOption("h")) {
        System.out.println("p");
        hasHelpOption = true;
    }

    if (!hasHelpOption) {
        CommandLine cmd2 = null;
        try {
            cmd2 = parser.parse(allOpts, args, true);
        } catch (ParseException ex) {
            Logger.getLogger(CLIReader.class.getName()).log(Level.SEVERE, null, ex);
        }
        serverUrl = cmd2.getOptionValue("url");
    }
}

如果您不喜欢这种方法(可能有充分的理由不喜欢它),那么您可以查看该问题中的其他答案。也许其中之一会更适合您的需求。

【讨论】:

  • 我尝试了其他方法,它对我有用,谢谢您的支持 btw
  • 您应该投票关闭作为副本,并留下评论告诉 OP 实际尝试副本上的答案。
  • @SoftwareEngineer - 我同意你的观点。感谢您的指导。
【解决方案2】:
   String s="--help";
String s1="[--help]";
String s2="[-h]";
String s3="-h";
  if(s.equals(args[0]) || s1.equals(args[0]))
  {
    System.out.println("usage: AutoLockComponent  -c <compList> -p <password> -s <streamName>\r\n" + 
        "       -u <user> -url <url> -v <yes/no>\r\n" + 
        " -c,--componentList <compList>   ComponentListPath\r\n" + 
        " -h,--help                       Usage Help\r\n" + 
        " -p,--password <password>        user password\r\n" + 
        " -s,--streamName <streamName>    Stream Name\r\n"  
        );
    System.exit(1);
  }

这对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多