Apache Commons CLI - 快速指南

发布于 2024-03-23 12:13:00 字数 16724 浏览 29 评论 0

Apache Commons CLI 是从 Java API 派生的 Apache Commons 的组件,并提供 API 来解析传递给程序的命令行参数/选项。该 API 还可以打印与可用选项有关的帮助。

命令行处理包括三个阶段。

  • 定义阶段
  • 解析阶段
  • 审讯阶段

定义阶段

在定义阶段,我们定义应用程序可以采取并采取相应措施的选项。 Commons CLI 提供了 Option 类,该类是 Option 对象的容器。

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

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

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

解析阶段

在解析阶段,我们在创建解析器实例之后解析使用命令行参数传递的选项。

//Create a parser
CommandLineParser parser = new DefaultParser();

//parse the options passed as command line arguments
CommandLine cmd = parser.parse( options, args);

审讯阶段

在询问阶段,我们检查是否存在特定选项,并相应地处理命令。

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

环境设置

本地环境设置

如果您仍然愿意为 Java 编程语言设置环境,那么本节将指导您如何在计算机上下载和设置 Java。请按照下面提到的步骤设置环境。可从 下载 Java 链接免费获得 Java SE。因此,您将根据您的操作系统下载一个版本。

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

设置 Windows 2000/XP 的路径

我们假设您已经在 C:/Program Files/java/jdk ​目录中安装了 Java

  • 右键单击 我的电脑 ,然后选择 属性。

  • 单击 高级 选项卡下的 环境变量 按钮。

  • 现在,更改 Path 变量,使其也包含 Java 可执行文件的路径。例如,如果当前路径设置为 C:/WINDOWS/SYSTEM32 ​,则将路径更改为 C:/WINDOWS/SYSTEM32; C:/Program Files/java/jdk/bin ​。

设置 Windows 95/98/ME 的路径

我们假设您已经在C:/Program Files/java/jdk目录中安装了Java-

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

设置 Linux,UNIX,Solaris,FreeBSD 的路径

环境变量 PATH 应该设置为指向 Java 二进制文件的安装位置。如果您在执行此操作时遇到困难,请参考您的 shell 文档。

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

流行的 Java 编辑器

要编写 Java 程序,需要一个文本编辑器。市场上有许多复杂的 IDE。但是现在,您可以考虑以下之一-

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

  • Netbeans-这是一个 Java IDE,它是开源的并且免费的,可以从 https://www.netbeans.org/index.html 下载。

  • Eclipse-这也是 eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 下载。

下载通用 CLI 存档

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

OSArchive name
Windowscommons-cli-1.4-bin.zip
Linuxcommons-cli-1.4-bin.tar.gz
Maccommons-cli-1.4-bin.tar.gz

设置 Apache 通用 CLI 环境

APACHE_HOME环境变量设置为指向 Apache jar 在您的计算机上存储的基本目录位置。假设,我们已在各种操作系统的 Apache 文件夹中提取了 commons-collections4-4.1-bin.zip,如下所示。

OSOutput
WindowsSet the environment variable APACHE_HOME to C:\Apache
Linuxexport APACHE_HOME=/usr/local/Apache
Macexport APACHE_HOME=/Library/Apache

设置 CLASSPATH 变量

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

OSOutput
WindowsSet the environment variable CLASSPATH to %CLASSPATH%;%APACHE_HOME%\commons-cli-1.4.jar;.;
Linuxexport CLASSPATH=$CLASSPATH:$APACHE_HOME/commons-cli-1.4.jar:.
Macexport CLASSPATH=$CLASSPATH:$APACHE_HOME/commons-cli-1.4.jar:.

第一个应用程序

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

创建一个名为 CLITester 的 Java 类。

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

输出

在传递-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

选项属性

Option 对象用于表示传递给命令行程序的 Option。以下是 Option 对象拥有的各种属性。

Sr.No.Name (Type) & Description
1

opt (String)

Identification string of the Option.

2

longOpt (String)

Alias and more descriptive identification string.

3

description (String)

Description of the function of the option.

4

required (boolean)

Flag to check whether the option must appear on the command line.

5

arg (boolean)

Flag to check whether the option takes an argument.

6

args (boolean)

Flag to check whether the option takes more than one argument.

7

optionalArg (boolean)

Flag to check whether the option s argument is optional.

8

argName (String)

Name of the argument value for the usage statement.

9

valueSeparator (char)

The character value used to split the argument string.

10

type (Object)

Argument type.

11

value (String)

Option value.

12

values (String[])

Values of the option.

布尔选项

布尔选项在命令行上通过其存在来表示。例如,如果存在 option,则其值为 true,否则视为 false。考虑下面的示例,在该示例中,我们正在打印当前日期,并且如果存在-t 标志,那么我们还将打印时间。

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);
    }
  }
}

输出

运行文件而不传递任何选项,然后查看结果。

java CLITester 
12/11/2017

在传递-t 作为选项的同时运行文件并查看结果。

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

参数选项

参数选项在命令行上由其名称和相应的值表示。例如,如果存在选项,则用户必须传递其值。考虑以下示例,如果要将日志打印到某个文件,则希望用户使用参数选项 logFile 输入日志文件的名称。

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" ) );
    }
  }
}

输出

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

java CLITester --logFile test.log
test.log

属性选项

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

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"));
    }
  }
}

输出

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

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

Posix 解析器

Posix 解析器用于解析 Posix,就像传递的参数一样。现在已弃用,并由 DefaultParser 代替。

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.");
    }
  } 
}

输出

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

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

在传递–D 作为选项的同时运行文件并查看结果。

java CLITester --D
D option was used.

GNU 解析器

GNU 解析器用于解析类似传递的参数的 gnu。现在已弃用,并由 DefaultParser 代替。

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"));
    }
  } 
}

输出

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

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

使用示例

Apache Commons CLI 提供了 HelpFormatter 类来打印命令行参数的用法指南。参见示例。

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);
  } 
}

输出

运行文件并查看结果。

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

帮助示例

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

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();   
  } 
}

输出

运行文件并查看结果。

java CLITester
usage: CLITester [-g] [-n ] [-p]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

ヤ经典坏疍

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文