Commons Cli 简明教程

Apache Commons CLI - Quick Guide

Apache Commons CLI - Overview

Apache Commons CLI 是 Apache Commons 的组件,它源自 Java API,并提供一个 API 来解析传递给程序的命令行参数/选项。此 API 还支持输出与可用选项有关的帮助信息。

命令行处理包含三个阶段。这些阶段在下面进行了说明 -

  1. Definition Stage

  2. Parsing Stage

  3. Interrogation Stage

Definition Stage

在定义阶段,我们定义应用程序可以使用的选项,并根据实际情况操作。Commons CLI 提供 Options 类,该类是 Option 对象的容器。

// create Options object
Options options = new Options();

// add a option
options.addOption("a", false, "add two numbers");

这里我们添加了一个选项标志 a,而第二个参数为 false,表明该选项不是必需的,而第三个参数表明该选项的描述。

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")) {
   // add the two numbers
} else if(cmd.hasOption("m")) {
   // multiply the two numbers
}

Apache Commons CLI - Environment Setup

在本章中,我们将了解 Apache Commons CLI 的本地环境设置,以及如何在 Windows 2000/XP、Windows 95/98/ME 等中设置 Commons CLI 的路径。我们还将了解一些流行的 Java 编辑器以及如何下载 Commons CLI 存档。

Local Environment Setup

如果您仍然愿意为 Java 编程语言设置环境,那么本章将指导您如何在机器上下载和设置 Java。请遵循以下步骤来设置环境。

Java SE 可从链接 https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html 免费获得。因此,你可以根据自己的操作系统下载一个版本。

按照说明下载 Java 并运行 .exe 以在你的计算机上安装 Java。在你的计算机上安装 Java 后,你需要设置环境变量以指向正确的安装目录。

Path for Windows 2000/XP

我们假设你已在 c:\Program Files\java\jdk 目录中安装了 Java。

  1. 右击 'My Computer' 并选择 'Properties'

  2. 单击 'Advanced' 选项卡下的 'Environment variables' 按钮。

  3. 现在,更改 'Path' 变量,以便它也包含 Java 可执行文件的路径。例如,如果路径当前设置为 'C:\WINDOWS\SYSTEM32' ,那么将你的路径更改为 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'

Path for Windows 95/98/ME

我们假设你已在 c:\Program Files\java\jdk 目录中安装了 Java。

  1. 编辑 'C:\autoexec.bat' 文件并在末尾添加以下行 - 'SET PATH =% PATH %;*C:\Program Files\java\jdk\bin'*.

Path for Linux, UNIX, Solaris, FreeBSD

应将环境变量 PATH 设置为已安装 Java 二进制文件的路径。如果您遇到问题,请参阅您的 shell 文档。

例如,如果您用 bash 作为您的 shell,则您将向您 '.bashrc: export PATH=/path/to/java:$PATH' 的末尾添加以下行

要编写 Java 程序,您需要一个文本编辑器。市场中有许多高级集成开发环境可用。但目前,您可以考虑以下选项之一 −

  1. Notepad − 在 Windows 计算机上,您可以使用任何简单的文本编辑器,例如记事本(推荐用于本教程)、TextPad。

  2. Netbeans − 它是一个开源免费的 Java IDE,可以从 www.netbeans.org/index.html 下载。

  3. Eclipse − 它也是一个由 eclipse 开源社区开发的 Java 集成开发环境,可以从 www.eclipse.org 下载。

Download Common CLI Archive

commons-cli-1.4-bin.zip 下载最新版本的 Apache Common CLI jar 文件。撰写本教程时,我们下载了 commons-cli-1.4-bin.zip 并将其复制到了 C:\Apache 文件夹。

OS

Archive name

Windows

commons-cli-1.4-bin.zip

Linux

commons-cli-1.4-bin.tar.gz

Mac

commons-cli-1.4-bin.tar.gz

Apache Common CLI Environment

设置 APACHE_HOME 环境变量,使其指向存储在您计算机上的 Apache jar 的基本目录位置。假设我们在不同操作系统上的 Apache 文件夹中以如下方式解压了 commonscollections4-4.1-bin.zip −

OS

Output

Windows

将环境变量 APACHE_HOME 设置为 C:\Apache

Linux

export APACHE_HOME = /usr/local/Apache

Mac

export APACHE_HOME = /Library/Apache

CLASSPATH Variable

设置 CLASSPATH 环境变量,使其指向 Common CLI jar 位置。假设您已将 commons-cli-1.4.jar 存储在不同操作系统上的 Apache 文件夹中,如下所示 −

OS

Output

Windows

存储 AIML 机器人</将环境变量 CLASSPATH 设置为 %CLASSPATH%;%APACHE_HOME%\commons-cli-1.4.jar;.;

Linux

export CLASSPATH = $CLASSPATH:$APACHE_HOME/commons-cli-1.4.jar:.

Mac

export CLASSPATH = $CLASSPATH:$APACHE_HOME/commons-cli-1.4.jar:.

Apache Commons CLI - First Application

让我们创建一个基于示例控制台的应用程序,其目的是根据所用的选项获取所传递数字的总和或乘积。

创建一个名为 CLITester 的 java 类。

Example

CLITester.java

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
   public static void main(String[] args) throws ParseException {
      //***Definition Stage***
      // create Options object
      Options options = new Options();

      // add option "-a"
      options.addOption("a", false, "add numbers");

      // add option "-m"
      options.addOption("m", false, "multiply numbers");

      //***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;
   }
}

Output

运行文件,同时传递 -a 作为选项,并传递数字作为结果获取数字的总和。

java CLITester -a 1 2 3 4 5
Sum of the numbers: 15

运行文件,同时传递 -m 作为选项,并传递数字作为结果获取数字的乘积。

java CLITester -m 1 2 3 4 5
Multiplication of the numbers: 120

Apache Commons CLI - Option Properties

使用 Option 对象来表示传递到命令行程序的 Option。Option 对象具有以下各种属性。

Sr.No

Name (Type) &s; Description

1

opt (String) Option 的标识符字符串。

2

longOpt (String) 别名和更多描述性标识符字符串。

3

description (String) 该选项功能的说明。

4

required (boolean) 标记,用来检查选项是否必须出现在命令行上。

5

arg (boolean) 标记,用来检查该选项是否采用一个参数。

6

args (boolean) 标记,用来检查该选项是否采用多个参数。

7

optionalArg (boolean) 标记,用来检查该选项的参数是否为可选的。

8

argName (String) 用法语句的参数值的名称。

9

valueSeparator (char) 用于分割参数字符串的字符值。

10

type (Object) Argument type.

11

value (String) Option value.

12

values (String[]) 选项的值。

Apache Commons CLI - Boolean Option

布尔选项在命令行中由其存在表示。例如,如果存在选项,那么其值为 true,否则,其会被视为 false。考虑以下示例,其中我们输出当前日期,如果存在 -t 标志。那么,我们还将输出时间。

Example

CLITester.java

import java.util.Calendar;
import java.util.Date;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CLITester {
   public static void main(String[] args) throws ParseException {
      Options options = new Options();
      options.addOption("t", false, "display time");

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

      Calendar date = Calendar.getInstance();
      int day = date.get(Calendar.DAY_OF_MONTH);
      int month = date.get(Calendar.MONTH);
      int year = date.get(Calendar.YEAR);

      int hour = date.get(Calendar.HOUR);
      int min = date.get(Calendar.MINUTE);
      int sec = date.get(Calendar.SECOND);

      System.out.print(day + "/" + month + "/" + year);
      if(cmd.hasOption("t")) {
         System.out.print(" " + hour + ":" + min + ":" + sec);
      }
   }
}

Output

在不传递任何选项的情况下运行该文件,然后查看结果。

java CLITester
12/11/2017

在将 -t 作为选项传递的同时运行该文件,然后查看结果。

java CLITester
12/11/2017 4:13:10

Apache Commons CLI - Argument Option

在命令行中,参数选项由其名称及其相应的值表示。例如,如果存在选项,那么用户必须传递其值。考虑以下示例,如果我们将日志输出到某个文件,为此,我们希望用户使用参数选项 logFile 输入日志文件的名称。

Example

CLITester.java

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CLITester {
   public static void main(String[] args) throws ParseException {
      Options options = new Options();
      Option logfile = Option.builder()
         .longOpt("logFile")
         .argName("file" )
         .hasArg()
         .desc("use given file for log" )
         .build();

      options.addOption(logfile);
      CommandLineParser parser = new DefaultParser();
      CommandLine cmd = parser.parse( options, args);

      // has the logFile argument been passed?
      if(cmd.hasOption("logFile")) {
         //get the logFile argument passed
         System.out.println( cmd.getOptionValue( "logFile" ) );
      }
   }
}

Output

在将 --logFile 作为选项传递的同时运行该文件,将该文件的名称作为该选项的值,然后查看结果。

java CLITester --logFile test.log
test.log

Apache Commons CLI - Properties Option

Properties 选项在命令行上由其名称及其相应属性(如语法)表示,类似于 Java 属性文件。考虑以下示例,如果我们要传递以下选项 -DrollNo = 1 -Dclass = VI -Dname = Mahesh,我们应该将每个值作为属性进行处理。让我们看一看实现逻辑。

Example

CLITester.java

import java.util.Properties;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CLITester {
   public static void main(String[] args) throws ParseException {
      Options options = new Options();
      Option propertyOption = Option.builder()
         .longOpt("D")
         .argName("property=value" )
         .hasArgs()
         .valueSeparator()
         .numberOfArgs(2)
         .desc("use value for given properties" )
         .build();

      options.addOption(propertyOption);
      CommandLineParser parser = new DefaultParser();
      CommandLine cmd = parser.parse( options, args);

      if(cmd.hasOption("D")) {
         Properties properties = cmd.getOptionProperties("D");
         System.out.println("Class: " + properties.getProperty("class"));
         System.out.println("Roll No: " + properties.getProperty("rollNo"));
         System.out.println("Name: " + properties.getProperty("name"));
      }
   }
}

Output

运行文件,同时将选项传递为键值对并查看结果。

java CLITester -DrollNo = 1 -Dclass = VI -Dname = Mahesh
Class: VI
Roll No: 1
Name: Mahesh

Apache Commons CLI - Posix Parser

Posix 解析器用于解析类似于 Posix 的传递的参数。它现在已被弃用,并已被 DefaultParser 替换。

Example

CLITester.java

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;

public class CLITester {
   public static void main(String[] args) throws ParseException {

      //Create posix like options
      Options posixOptions = new Options();
      posixOptions.addOption("D", false, "Display");
      posixOptions.addOption("A", false, "Act");

      CommandLineParser posixParser = new PosixParser();

      CommandLine cmd = posixParser.parse(posixOptions, args);

      if( cmd.hasOption("D") ) {
         System.out.println("D option was used.");
      }
      if( cmd.hasOption("A") ) {
         System.out.println("A option was used.");
      }
   }
}

Output

运行文件,同时传递 -D -A 作为选项并查看结果。

java CLITester -D -A
D option was used.
A option was used.

运行文件,同时传递 --D 作为选项并查看结果。

java CLITester --D
D option was used.

Apache Commons CLI - GNU Parser

GNU 解析器用于解析类似 gnu 的传递参数。现在它已被弃用,并替换为 DefaultParser。

Example

CLITester.java

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CLITester {
   public static void main(String[] args) throws ParseException {

      //Create GNU like options
      Options gnuOptions = new Options();
      gnuOptions.addOption("p", "print", false, "Print")
         .addOption("g", "gui", false, "GUI")
         .addOption("n", true, "Scale");

      CommandLineParser gnuParser = new GnuParser();
      CommandLine cmd = gnuParser.parse(gnuOptions, args);

      if( cmd.hasOption("p") ) {
         System.out.println("p option was used.");
      }
      if( cmd.hasOption("g") ) {
         System.out.println("g option was used.");
      }
      if( cmd.hasOption("n") ) {
         System.out.println("Value passed: " + cmd.getOptionValue("n"));
      }
   }
}

Output

在传递 -p -g -n 10 作为选项时运行文件并查看结果。

java CLITester -p -g -n 10
p option was used.
g option was used.
Value passed: 10

Apache Commons CLI - Usage Example

Apache Commons CLI 提供 HelpFormatter 类以输出命令行参数的使用指南。请参阅下面给出的示例 -

Example

CLITester.java

import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CLITester {
   public static void main(String[] args) throws ParseException {

      Options options = new Options();
      options.addOption("p", "print", false, "Send print request to printer.")
         .addOption("g", "gui", false, "Show GUI Application")
         .addOption("n", true, "No. of copies to print");

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

Output

运行该文件,然后查看结果。

java CLITester
usage: CLITester
-g,--gui Show GUI Application
-n <arg> No. of copies to print
-p,--print Send print request to printer.

Apache Commons CLI - Help Example

Apache Commons CLI 提供 HelpFormatter 类来打印与命令行参数相关的帮助。参见示例。

Example

CLITester.java

import java.io.PrintWriter;

import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CLITester {
   public static void main(String[] args) throws ParseException {

      Options options = new Options();
      options.addOption("p", "print", false, "Send print request to printer.")
         .addOption("g", "gui", false, "Show GUI Application")
         .addOption("n", true, "No. of copies to print");

      HelpFormatter formatter = new HelpFormatter();

      final PrintWriter writer = new PrintWriter(System.out);
      formatter.printUsage(writer,80,"CLITester", options);
      writer.flush();
   }
}

Output

运行该文件,然后查看结果。

java CLITester
usage: CLITester [-g] [-n <arg>] [-p]