天天看點

java Option類/DefaultParser的使用,擷取大量指令行參數(使用者友好,支援長/短參數,支援預設參數,支援必填,支援幫助)

之前的文章中介紹了如何通過加載包外部配置檔案來擷取參數。

本文則是另一個場景,不加載檔案,而是從指令行擷取所有的參數,因為數量較多,是以将有關内容放在啟動腳本中。

在項目下建立bin目錄,在bin目錄下建立start_test.sh。内容格式如下:

param1="parameter1"
param2="parameter2"

command="
--param1=${param1} \
--param2=${param2}
"

java_opts=" -Xmx20g -Xms20g -Xmn16g -Xss500k"

java -cp ../xxx.jar \
xxx.MainClassName \
$command
           

建立參數讀入工具類如下,核心是parseOptions(),這個方法的作用主要包括:

  • 建立option和類成員的映射關系(也就是指令行參數被映射程序式)
  • 檢查必填
  • 預設值設定
import org.apache.commons.cli.*;
import java.util.ArrayList;
import java.util.List;

public class xxxParameterUtils {
	CommandLine cmdLine =null;
	List<Options> requiredOpts = new ArrayLias<>();

	int param_eter_num = 0;
	public static fianl Option PARAM_ETER_NUM_OPTION = 
		new Option("p_num","parameter_num", ture, "參數");
	//短opt,長opt,是否有參數,description

	public static final Option HELP_OPTION = new Option("h","help",false,"Help");	

	public xxxParameterUtils() {
		//requiredOpts.add(); //添加必選參數
	}

	public Options getOptions() { //往options中加入所有option
		final Options options = new Options();
		options.addOption(PARAM_ETER_NUM_OPTION);
		return options;
	}

	public CommandLine parseOptions(String[] args) {
		final Options = getOptions();
		CommandLineParser parser = new DefaultParser();

		try {
			cmdLine = parser.parse(options, args);
		} catch (ParseException e) {
			//your handling
		}

		if(cmdLine.hasOption(HELP_OPTION.getOpt())) {
			printHelpAndExit(options, 0);
		}

		for(Option opt : requiredOpts) {
			if(!cmdLine.hasOption(opt.getOpt())) {
				printHelpAndExit(options, 0);
			}
		}
		
		this.param_meter_num = cmdLine.hasOption(PARAM_METER_NUM_OPTION.getOpt()) ? 
			Integer.valueOf(cmdLine.getOptionValue(PARAM_METER_NUM_OPTION.getOpt())) : 0;

		return cmdLine;
	}

	@Override
	public String toString() {
		return "xxxParamUtils{" + "param_meter_num=" + param_meter_num +'}'
	}

	public void printHelpAndExit(Options options, int exitCode) {
		HelpFormatter formatter = new HelpFormatter();
		formatter.printHelp("help","",options,"腳注");
		System.exit(exitCode);
	}
}