Apache Commons CLI命令行启动
今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式——比如可以从命令行启动,也可以从web端启动。今天就看看如何设计命令行启动...
Apache Commons CLI
Apache Commons CLI是开源的命令行解析工具,它可以帮助开发者快速构建启动命令,并且帮助你组织命令的参数、以及输出列表等。
CLI分为三个过程:
- 定义阶段:在Java代码中定义Optin参数,定义参数、是否需要输入值、简单的描述等
- 解析阶段:应用程序传入参数后,CLI进行解析
- 询问阶段:通过查询CommandLine询问进入到哪个程序分支中
举个栗子
定义阶段:
Options options = new Options();
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);
opt = new Option("c", "configFile", true, "Name server config properties file");
opt.setRequired(false);
options.addOption(opt);
opt = new Option("p", "printConfigItem", false, "Print all config item");
opt.setRequired(false);
options.addOption(opt);
其中Option的参数:
- 第一个参数:参数的简单形式
- 第二个参数:参数的复杂形式
- 第三个参数:是否需要额外的输入
- 第四个参数:对参数的描述信息
解析阶段
通过解析器解析参数
CommandLine commandLine = null;
CommandLineParser parser = new PosixParser();
try {
commandLine = parser.parse(options, args);
}catch(Exception e){
//TODO xxx
}
询问阶段
根据commandLine查询参数,提供服务
HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);
if (commandLine.hasOption('h')) {
// 打印使用帮助
hf.printHelp("testApp", options, true);
}
全部代码样例
package hangout.study;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
public class CLITest {
public static void main(String[] args) {
String[] arg = { "-h", "-c", "config.xml" };
testOptions(arg);
}
public static void testOptions(String[] args) {
Options options = new Options();
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);
opt = new Option("c", "configFile", true, "Name server config properties file");
opt.setRequired(false);
options.addOption(opt);
opt = new Option("p", "printConfigItem", false, "Print all config item");
opt.setRequired(false);
options.addOption(opt);
HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);
CommandLine commandLine = null;
CommandLineParser parser = new PosixParser();
try {
commandLine = parser.parse(options, args);
if (commandLine.hasOption('h')) {
// 打印使用帮助
hf.printHelp("testApp", options, true);
}
// 打印opts的名称和值
System.out.println("--------------------------------------");
Option[] opts = commandLine.getOptions();
if (opts != null) {
for (Option opt1 : opts) {
String name = opt1.getLongOpt();
String value = commandLine.getOptionValue(name);
System.out.println(name + "=>" + value);
}
}
}
catch (ParseException e) {
hf.printHelp("testApp", options, true);
}
}
}
运行结果
usage: testApp [-c <arg>] [-h] [-p]
-c,--configFile <arg> Name server config properties file
-h,--help Print help
-p,--printConfigItem Print all config item
--------------------------------------
help=>null
configFile=>config.xml
Hangout中的应用
源码片段
package hangout.study;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class HangoutMainTest {
/**
* 解析Hangout参数
*
* @param args
* @return
* @throws ParseException
*/
private static CommandLine parseArg(String[] args) throws ParseException {
//定义阶段
Options options = new Options();
options.addOption("h", false, "usage help");
options.addOption("help", false, "usage help");
options.addOption("f", true, "configuration file");
options.addOption("l", true, "log file");
options.addOption("w", true, "filter worker number");
options.addOption("v", false, "print info log");
options.addOption("vv", false, "print debug log");
options.addOption("vvvv", false, "print trace log");
//解析阶段
CommandLineParser paraer = new BasicParser();
CommandLine cmdLine = paraer.parse(options, args);
//询问阶段
if (cmdLine.hasOption("help") || cmdLine.hasOption("h")) {
/*usage(); //这里作者自定义了帮助信息,其实可以使用helpFormat直接输出的*/
HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);
hf.printHelp("testApp", options, true);
System.exit(-1);
}
// TODO need process invalid arguments
if (!cmdLine.hasOption("f")) {
throw new IllegalArgumentException("Required -f argument to specify config file");
}
return cmdLine;
}
public static void main(String[] args) throws Exception {
String[] arg = {"-h","xx.file"};//输入参数
CommandLine cmdLine = parseArg(arg);//解析参数
System.out.println(cmdLine.getOptionValue("f"));//拿到重要参数
//TODO
}
}
参考
1 Apache Commons CLI 下载地址
2 Apache Commons CLI 官方指南
3 IBM 开发者文档
4 CSDN Commons CLI 使用详解
Apache Commons CLI命令行启动的更多相关文章
- Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式
昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...
- Apache Commons CLI 开发命令行工具示例
概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...
- 使用 Apache Commons CLI 开发命令行工具示例
Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...
- 使用 Apache Commons CLI 解析命令行参数示例
很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...
- Apache Commons CLI 简介
CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被 ...
- Spring Boot通过命令行启动发生FileNotFoundException
Spring Boot + Jersey 通过命令行启动会发生错误FileNotFoundException异常 异常信息如下: ERROR o.a.c.c.C.[Tomcat].[localhost ...
- 【Problem】xampp in ubuntu下命令行启动mysql报错: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)
xampp in ubuntu下命令行启动mysql报错: reddevil@reddevil-Lenovo:/opt/lampp$ ./bin/mysql -u root -p Enter pass ...
- sublime text2在windows中以命令行启动
sublime text2在windows中以命令行启动 把执行文件添加到PATH中即可,如图: 如果你和我一样习惯了mac下的简写subl,那么需要在程序目录中新建一个批处理文件subl.bat ...
- 记一次使用命令行启动部署在tomcat上的应用
在Eclipes进行程序开发完成后,一般都会直接在Eclipse部署启动,其中的一些启动参数设置都会在其中进行,若用命令行启动,则需要手动配置. 程序开发完成后打成的war包,需要部署到Tomcat应 ...
随机推荐
- Centos 7下mysql的安装与配置
1,先下载好MySQ安装包并解压(不做详细说明). 2,上传解压后的MySQL安装包到虚拟机上. 3,安装MySQL [root@localhost /]# yum install mysql5.7. ...
- 实验一报告--认识DOS
实验一 DOS命令解释程序的编写 13物联网 黄鸿佳 201306104107 一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: ...
- hibernate的缓存机制
hibernate提供两种缓存:一级缓存和二级缓存 一.一级缓存:也就是Session缓存(又称作事务缓存):Hibernate内置的,不能卸除. 在同一个Session里面,第一次调用get()方法 ...
- HDU 1284 钱币兑换问题
动态转移方程:dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] 即要想兑够 i,有三种方法: 1.从 i - 1 再增加一个1分的: 2.从 i - 2 再增加一个2 ...
- vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2.1) 但是
Ubuntu 12.10 安装vim出错[日期:2013-01-18] 来源:Linux社区 作者:Cubernet [字体:大 中 小] 在Ubuntu 12.10中安装vim时出现了如下提示:正在 ...
- 各廠商ERP系統架構圖連結 (ERP流程圖)(轉)
各廠商ERP系統架構圖連結 (ERP流程圖) 資料來源 Google圖片搜尋ERP整理而來 資通電腦 ArgoERP 資通電腦 Oracle ERP 鼎新電腦 Workflow ERP鼎新電腦 S ...
- html5实战2
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- spark on centos6.5 安装
第一步在centos 6.5上安装java 运行环境 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18 ...
- 解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译) http://improve.dk/orcamdf-now-exposes-metadata-through-s ...
- android 启动过程
android系统启动的时候首先会启动Linux的基础进程,加载Linux kernel启动初始化(init)进程. 接着,回启动Linux deamon(守护进程)会启动以下的内容: ①启动USBd ...