Commons Cli 简明教程
Apache Commons CLI - Overview
Apache Commons CLI 是 Apache Commons 的组件,它源自 Java API,并提供一个 API 来解析传递给程序的命令行参数/选项。此 API 还支持输出与可用选项有关的帮助信息。
命令行处理包含三个阶段。这些阶段在下面进行了说明 -
-
Definition Stage
-
Parsing Stage
-
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,表明该选项不是必需的,而第三个参数表明该选项的描述。
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。
-
右击 'My Computer' 并选择 'Properties' 。
-
单击 'Advanced' 选项卡下的 'Environment variables' 按钮。
-
现在,更改 '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。
-
编辑 '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' 的末尾添加以下行
Popular Java Editors
要编写 Java 程序,您需要一个文本编辑器。市场中有许多高级集成开发环境可用。但目前,您可以考虑以下选项之一 −
-
Notepad − 在 Windows 计算机上,您可以使用任何简单的文本编辑器,例如记事本(推荐用于本教程)、TextPad。
-
Netbeans − 它是一个开源免费的 Java IDE,可以从 www.netbeans.org/index.html 下载。
-
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;
}
}
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);
}
}
}
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" ) );
}
}
}
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"));
}
}
}
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.");
}
}
}
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"));
}
}
}
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);
}
}
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();
}
}