代码之家  ›  专栏  ›  技术社区  ›  lemoncodes

Apache命令行分析器

  •  0
  • lemoncodes  · 技术社区  · 7 年前

    我从tutorials point的示例代码中得到了下面的代码,并对其进行了一些调整。

    应用程序.java

    public static void main(String[] args) throws ParseException {
            CommandTest t = new CommandTest();
            t.start(args);
    }
    

    命令测试.java

    public class CommandTest {
    
        void start(String[] args) throws ParseException {
    
              //***Definition Stage***
              // create Options object
              Options options = new Options();
    
              // add option "-a"
              options.addOption(
                        Option.builder("a")
                            .longOpt("add")
                            .desc("add numbers")
                            .hasArg(false)
                            .valueSeparator('=')
                            .required(false)
                            .build()
                      );
    
              // add option "-m"
              options.addOption("m", false, "");
              options.addOption(
                        Option.builder("m")
                            .longOpt("multiply")
                            .desc("multiply numbers")
                            .hasArg(false)
                            .valueSeparator('=')
                            .required(false)
                            .build()
                      );
    
              //***Parsing Stage***
              //Create a parser
              CommandLineParser parser = new DefaultParser();
    
              //parse the options passed as command line arguments
              CommandLine cmd = parser.parse( options, args);
    
              //***Interrogation Stage***
              //hasOptions checks if option is present or not
              if(cmd.hasOption("a")) { 
                 System.out.println("Sum of the numbers: " + getSum(args));
              } else if(cmd.hasOption("m")) {
                 System.out.println("Multiplication of the numbers: " + getMultiplication(args));
              }
           }
    
           public static int getSum(String[] args) {
              int sum = 0;
              for(int i = 1; i < args.length ; i++) {
                 sum += Integer.parseInt(args[i]);
              } 
              return sum;
           }
    
           public static int getMultiplication(String[] args) {
              int multiplication = 1;
              for(int i = 1; i < args.length ; i++) {
                 multiplication *= Integer.parseInt(args[i]);
              } 
              return multiplication;
           }
    }
    

    现在,我的问题是,当我试图用参数 -multi 还可以接受吗?我已经设置了只接收其中一个的选项 -m -multiply . 不过,它还是会接受的 -多

    我正在使用commons-cli-1.3.1(顺便说一下,我正在调试遗留代码)

    注意:上面的源代码只是一个示例源代码,不需要应用实际的编码准则(好的或坏的),我只想知道为什么会发生这样的行为。

    0 回复  |  直到 6 年前
        1
  •  2
  •   BackSlash    7 年前

    org.apache.commons.cli.Options:233 ):

    public List<String> getMatchingOptions(String opt) {
      opt = Util.stripLeadingHyphens(opt);
      List<String> matchingOpts = new ArrayList();
      if (this.longOpts.keySet().contains(opt)) {
        return Collections.singletonList(opt);
      } else {
        Iterator var3 = this.longOpts.keySet().iterator();
    
        while(var3.hasNext()) {
          String longOpt = (String)var3.next();
          /******************************************************/
          /* longOpt = "multiply"                               */
          /* opt = "multi"                                      */
          /******************************************************/
          if (longOpt.startsWith(opt)) {
            matchingOpts.add(longOpt);
          }
          /******************************************************/
        }
    
        return matchingOpts;
      }
    }
    

    在突出显示的块中可以看到,如果短选项不匹配,库将搜索第一个与输入的选项部分匹配的长选项。它使用 startsWith "multiply".startsWith("multi") true --multiply .

    推荐文章