技術開発日記

技術やら日々思ったことを綴ってます。

Commons CLI

Jakarta Commons CLI というものが最近あるのを知ったので、少し調べてみた。

いちようコマンドラインオプション解析ライブラリということだけど、つまりはシェルスクリプトとかでjavaを呼んだりするときに、optionやらhelpとかを簡単に実装できるライブラリってことだと思う。

以下に簡単なサンプルをまとめてみた。

public class CliSample {

	public static void main(String[] args) {
	
	        // コマンド引数全体を定義するオブジェクト
        	Options options = new Options();

			// addOption("オプション名","長文字オプション名","パラメータが必須か","コマンド説明")
	        options.addOption("h","help",false,"書くオプションの説明です。");
			options.addOption("v","version",false,"バージョン情報を出力します。");
	        options.addOption( OptionBuilder.withLongOpt("file")        	    		// 長文字オプション名
	                                        .withDescription("ファイルの存在を確認") 	// コマンド説明
	                                        .hasArg(true)								// コマンド引数が必須(trueはなくても同じ意味
	                                        .withArgName("filePath")					// 引数名
	                                        .create("f") );								// オプション名
	        
	        // パーサーを作成
	        CommandLineParser parser = new BasicParser();
	        // 
	        CommandLine commandLine;
	        try {
	            commandLine = parser.parse(options, args);
	        }
	        catch (ParseException e) {
	            System.err.println("parse error");
	            showHelp(options);
	            return;
	        }
	        // 「-h」の場合
	        if (commandLine.hasOption("h")) {
	            showHelp(options);
	            return;
	        }
	        // 「-v」の場合
	        if (commandLine.hasOption("v")) {
	            System.out.println("1.0");
	            return;
	        }
	        // 「-f」の場合
	        if (commandLine.hasOption("f")) {
	            // 引数を取得
	          	String filePath = commandLine.getOptionValue("f");
	          	
	          	File file = new File(filePath);
	          	String result = "ファイルは存在しません。";
	          	if (file.exists()) {
	          		result = "ファイルは存在します。";
	          	}
	          	
	            System.out.println(result);
	            return;
	        }
	}

	/**
	 * エラーの場合にヘルプ用の内容を出力
	 */
	private static void showHelp(Options options) {
	    HelpFormatter help = new HelpFormatter();
	    // ヘルプを出力
	    help.printHelp("UpdateKeyword", options, true);
	}
}

上記の内容に対して以下の様なコマンドが叩ける。
java CliSample -h
java CliSample -v
java CliSample -f sampl.txt

※また今回はパーサーとして「BasicParser」を使用しているが他にも「GnuParser」と「PosixParser」というものがあって、これらはオプションの引数の指定の方法の違いがあらしい。
例)BasicParserは「--file=sample.txt」はダメだがGnuParserOKなど。
参考:http://flylib.com/books/en/1.51.1.63/1/