之前的文章中介绍了如何通过加载包外部配置文件来获取参数。
本文则是另一个场景,不加载文件,而是从命令行获取所有的参数,因为数量较多,所以将有关内容放在启动脚本中。
在项目下创建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);
}
}