Commons-cli-quick-guide

提供:Dev Guides
移動先:案内検索

Apache Commons CLI-概要

Apache Commons CLIは、Java APIから派生したApache Commonsのコンポーネントであり、プログラムに渡されたコマンドライン引数/オプションを解析するAPIを提供します。 このAPIは、利用可能なオプションに関連するヘルプを印刷することもできます。

コマンドライン処理は3つのステージで構成されます。

  • 定義ステージ
  • 解析段階
  • 尋問段階

定義ステージ

定義段階では、アプリケーションが使用できるオプションを定義し、それに応じて動作します。 Commons CLIは、OptionオブジェクトのコンテナであるOptionsクラスを提供します。

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

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

ここでオプションフラグaを追加しました。2番目のパラメーターとしてのfalseはオプションが必須ではないことを示し、3番目のパラメーターはオプションの説明を示します。

解析段階

解析段階では、パーサーインスタンスを作成した後、コマンドライン引数を使用して渡されたオプションを解析します。

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

Apache Commons CLI-環境のセットアップ

ローカル環境のセットアップ

Javaプログラミング言語用に環境をセットアップする場合は、このセクションで、マシンにJavaをダウンロードしてセットアップする方法を説明します。 環境をセットアップするには、以下の手順に従ってください。

Java SEは、https://java.sun.com/javase/downloads/index_jdk5.jsp [Javaのダウンロード]リンクから無料で入手できます。 そのため、オペレーティングシステムに基づいてバージョンをダウンロードします。

指示に従って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バイナリがインストールされている場所を指すように設定する必要があります。 これがうまくいかない場合は、シェルのドキュメントを参照してください。

たとえば、bashをシェルとして使用する場合は、 '。bashrcの最後に次の行を追加します:export PATH =/path/to/java:$ PATH'

人気のあるJavaエディター

Javaプログラムを作成するには、テキストエディターが必要です。 市場には多くの洗練されたIDEがあります。 しかし、今のところ、次のいずれかを検討することができます-

共通CLIアーカイブをダウンロードする

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共通CLI環境を設定する

*APACHE_HOME* 環境変数を設定して、マシン上のApache jarが保存されているベースディレクトリの場所を指すようにします。 次のように、さまざまなオペレーティングシステムのApacheフォルダーにcommons-collections4-4.1-bin.zipを抽出したと仮定します。
OS Output
Windows Set the environment variable APACHE_HOME to C:\Apache
Linux export APACHE_HOME=/usr/local/Apache
Mac export APACHE_HOME=/Library/Apache

CLASSPATH変数を設定する

共通CLI jarの場所を指すように CLASSPATH 環境変数を設定します。 次のように、さまざまなオペレーティングシステムのApacheフォルダーにcommons-cli-1.4.jarを保存したと仮定します。

OS Output
Windows Set the environment variable CLASSPATH to %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-最初のアプリケーション

使用したオプションに基づいて、渡された数値の合計または渡された数値の乗算のいずれかを取得することを目的とした、サンプルコンソールベースのアプリケーションを作成しましょう。

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

Apache Commons CLI-オプションのプロパティ

Optionオブジェクトは、コマンドラインプログラムに渡されるOptionを表すために使用されます。 以下は、Optionオブジェクトが持つさまざまなプロパティです。

Sr.No. Name (Type) & Description
1

opt (String)

オプションの識別文字列。

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)

引数のタイプ。

11

value (String)

オプション値。

12

values (String[])

オプションの値。

Apache Commons CLI-ブール値オプション

ブールオプションは、コマンドラインでその存在によって表されます。 たとえば、オプションが存在する場合、その値は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

Apache Commons CLI-引数オプション

引数オプションは、コマンドラインで名前と対応する値で表されます。 たとえば、オプションが存在する場合、ユーザーはその値を渡す必要があります。 次の例を考えてみましょう。ログを何らかのファイルに出力する場合、ユーザーに引数オプション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

Apache Commons CLI-プロパティオプション

プロパティオプションは、コマンドラインでその名前と、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

Apache Commons CLI-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.

Apache Commons CLI-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-使用例

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 <arg>     No. of copies to print
 -p,--print   Send print request to printer.

Apache Commons CLI-ヘルプの例

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 <arg>] [-p]