Apache CommonsCLI-クイックガイド

Apache Commons CLIは、JavaAPIから派生したApacheCommonsのコンポーネントであり、プログラムに渡されるコマンドライン引数/オプションを解析するための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のローカル環境のセットアップと、Windows 2000 / XP、Windows 95/98 / MEなどのCommonsCLIのパスをセットアップする方法について学習します。また、いくつかの一般的なJavaエディターとCommonsCLIアーカイブをダウンロードする方法。

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

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

JavaSEはリンクから無料で入手できます https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html。したがって、オペレーティングシステムに基づいたバージョンをダウンロードできます。

指示に従ってJavaをダウンロードし、.exeを実行してJavaをマシンにインストールします。マシンにJavaをインストールしたら、正しいインストールディレクトリを指すように環境変数を設定する必要があります。

Windows 2000 / XPのパス

Javaをにインストールしていることを前提としています c:\Program Files\java\jdk ディレクトリ。

  • 右クリック 'My Computer' 選択します 'Properties'

  • クリックしてください 'Environment variables' 下のボタン 'Advanced' タブ。

  • 今、変更します 'Path'変数。Java実行可能ファイルへのパスも含まれます。例、パスが現在に設定されている場合'C:\WINDOWS\SYSTEM32'、次にパスを変更して読み取ります 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'

Windows 95/98 / MEのパス

Javaをにインストールしていることを前提としています c:\Program Files\java\jdk ディレクトリ。

  • 編集する '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があります。しかし今のところ、あなたは次のいずれかを考えることができます-

  • Notepad − Windowsマシンでは、メモ帳(このチュートリアルに推奨)、TextPadなどの単純なテキストエディターを使用できます。

  • Netbeans−これはオープンソースで無料のJava IDEであり、www.netbeans.org /index.htmlからダウンロードできます。

  • Eclipse−これはEclipseオープンソースコミュニティによって開発されたJava IDEでもあり、www.eclipse.orgからダウンロードできます。

CommonCLIアーカイブをダウンロードする

commons-cli-1.4-bin.zipから最新バージョンのApacheCommon CLIjarファイルをダウンロードします。このチュートリアルの執筆時点で、commons-cli-1.4-bin.zipをダウンロードし、C:\> Apacheフォルダーにコピーしました。

OS アーカイブ名
ウィンドウズ commons-cli-1.4-bin.zip
Linux commons-cli-1.4-bin.tar.gz
マック commons-cli-1.4-bin.tar.gz

Apache CommonCLI環境

をセットする APACHE_HOMEApachejarがマシンに保存されているベースディレクトリの場所を指す環境変数。次のように、さまざまなオペレーティングシステムのApacheフォルダーにcommonscollections4-4.1-bin.zipを抽出したと仮定します。

OS 出力
ウィンドウズ 環境変数APACHE_HOMEをC:\ Apacheに設定します
Linux エクスポートAPACHE_HOME = / usr / local / Apache
マック エクスポートAPACHE_HOME = / Library / Apache

CLASSPATH変数

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

OS 出力
ウィンドウズ AIMLボットを格納します</環境変数CLASSPATHを%CLASSPATH%;%APACHE_HOME%\ commons-cli-1.4.jar;。;に設定します
Linux export CLASSPATH = $ CLASSPATH:$ APACHE_HOME /commons-cli-1.4.jar:。
マック export 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オブジェクトが持つさまざまなプロパティです。

シニア番号 名前(タイプ)&s; 説明
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[])

オプションの値。

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

プロパティオプションは、コマンドラインでその名前と、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を解析するために使用されます。現在は非推奨であり、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を解析するために使用されます。現在は非推奨であり、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 <arg> 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 <arg>] [-p]