使用ApacheCommonsCLi 来开发命令行工具

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

 体验了下ApacheCommonsCLi 工具,发现非常好用,可以建立命令行

不说废话了,奉上例子:

 

 
 

  1. /** 
  2.  * @author charles.wang 
  3.  * @created Jan 10, 2012 4:30:22 PM 
  4.  * Description: 
  5.  */ 
  6. public class RMDataSource { 
  7.  
  8.      
  9.     //简单的测试下 
  10.     public static int simpleTest(String[] args){ 
  11.          
  12.         ResourceBundle resourceBundle = ResourceBundle.getBundle("message",Locale.getDefault()); 
  13.          
  14.         //创建一组Option并且封装在Options对象中 
  15.         Options opts = new Options();  
  16.         //每个选项有3个参数, 
  17.         //第一个参数是简短的名字, 
  18.         //第二个参数是这个命令选项是否需要参数, 
  19.         //第三个参数是这个选项的描述 
  20.         opts.addOption("h"false, resourceBundle.getString("HELP_DESCRIPTION")); 
  21.         opts.addOption("i"true, resourceBundle.getString("HELP_IPADDRESS"));  
  22.         opts.addOption("p"true, resourceBundle.getString("HELP_PORT"));  
  23.         opts.addOption("t"true, resourceBundle.getString("HELP_PROTOCOL"));  
  24.          
  25.         //创建一个基本解析器 
  26.         BasicParser parser = new BasicParser();  
  27.         //表示一个命令行对象,将会被Options所解析 
  28.         CommandLine cl;  
  29.         try {  
  30.             //让解析器来基于Options来解析命令行传入的参数,解析的结果放入CommandLine对象 
  31.             cl = parser.parse(opts, args);  
  32.             //如果解析完得到的Option的集合长度不为空,表明有一些选项 
  33.             if (cl.getOptions().length > 0) {  
  34.                  
  35.                 //对选项进行判断,首先看是否有-h选项,这个选项是用于打印出帮助,不做其他任何动作 
  36.                 //如果有h选项,则用HelpFormatter打印出所有选项列表 
  37.                 if (cl.hasOption('h')) {  
  38.                     //用于打印出帮助选项的HelpFormatter 
  39.                     HelpFormatter hf = new HelpFormatter();  
  40.                     hf.printHelp("Options", opts);  
  41.                     return 0
  42.                 }  
  43.                 //否则,将这些选项分离出来,并且来执行判断和构建动作 
  44.                 else {  
  45.                     //分离出这些选项名对应的值 
  46.                     String ip = cl.getOptionValue("i");  
  47.                     String port = cl.getOptionValue("p");  
  48.                     String protocol = cl.getOptionValue("t");  
  49.                     System.out.println("ip: "+ip); 
  50.                     System.out.println("port: "+port); 
  51.                     System.out.println("protocol:   "+protocol); 
  52.                     return 0
  53.                 }  
  54.             }  
  55.             //否则,表明没有解析到任何的选项,所以就出错 
  56.             else {  
  57.                System.err.println(resourceBundle.getString("ERROR_NOARGS"));  
  58.                return 1
  59.             }  
  60.         } catch (ParseException e) {  
  61.             e.printStackTrace();  
  62.             return 1
  63.         }  
  64.     }  
  65.      
  66.  

 

单元测试:

 

 
 
  1. public class RMDataSourceTest { 
  2.  
  3.     @Before 
  4.     public void setUp() throws Exception { 
  5.     } 
  6.  
  7.     @After 
  8.     public void tearDown() throws Exception { 
  9.     } 
  10.  
  11.     // 测试带有 –h 参数的代码功能,则应该打印出帮助文档,并且正确返回 
  12.     @Test 
  13.     public void testHelp() {  
  14.         System.out.println("***TC:Test -h option***"); 
  15.         String args[]={"-h"};  
  16.         assertEquals(0, RMDataSource.simpleTest(args));  
  17.         System.out.println("***********************"); 
  18.     }  
  19.  
  20.     // 测试没有带 –h 参数的代码功能 ,则 应该有错误,因为不允许没有参数的命令行 
  21.     @Test 
  22.     public void testNoArgs() {  
  23.         System.out.println("***TC:Test no argument options***"); 
  24.         String args[] = new String[0];  
  25.         assertEquals(1, RMDataSource.simpleTest(args));  
  26.         System.out.println("***********************"); 
  27.     }  
  28.  
  29.     // 测试输入所有正确参数的代码功能,此时应该正确返回 
  30.     @Test 
  31.     public void testRMDataSource() {  
  32.       /**  
  33.        * 此字符串参数等同于在命令行窗口输入命令 java rmdatasource -i 192.168.0.2 -p 5988 -t http  
  34.         */  
  35.         System.out.println("***TC:Test normal arguments options***"); 
  36.         String args[] = new String[]{"-i","192.168.0.2","-p","5988","-t","http"};  
  37.         assertEquals(0, RMDataSource.simpleTest(args));  
  38.         System.out.println("***********************"); 
  39.     }  
  40.  




本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/840707,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
Swift
3 Swiftc命令行工具
Swiftc命令行工具
36 0
|
9月前
|
C++ Docker Python
M1 Pro 利用docker 搭建pytho2的开发环境,以vscode连接开发为例
M1 Pro 利用docker 搭建pytho2的开发环境,以vscode连接开发为例
196 0
|
缓存
Storcli工具使用方法(附管理工具)
Storcli工具使用方法(附管理工具)
1185 0
|
1月前
|
Unix Shell Linux
阿里云命令行工具
阿里云命令行工具
22 3
|
10月前
|
jenkins 测试技术 持续交付
基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程
基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程
404 1
|
1月前
|
JavaScript 前端开发 数据安全/隐私保护
NodeJS 下构建 命令行工具(CLI) 与 交互式命令界面 的实践
NodeJS 下构建 命令行工具(CLI) 与 交互式命令界面 的实践
288 1
|
7月前
|
存储 JSON Go
Go 命令行框架: 构建强大的命令行工具
Go 命令行框架: 构建强大的命令行工具
|
JavaScript 前端开发 数据安全/隐私保护
NodeJS 下构建 命令行工具 与 交互式命令界面 的实践
NodeJS 下构建命令行工具 与 交互式命令界面 的实践
530 0
NodeJS 下构建 命令行工具 与 交互式命令界面 的实践
|
存储 网络协议 关系型数据库
金瓯无缺江河一统|Win10系统基于Docker和Python3搭建并维护统一认证系统OpenLdap
OpenLdap(Lightweight Directory Access Protocol)是什么?它其实是一个开源的、具备工业标准特性的应用协议,可以使用TCP协议提供访问控制和维护分布式信息的目录信息。这是一个传统意义上的书面解释,是的,毫无疑问,你会一脸懵逼。
金瓯无缺江河一统|Win10系统基于Docker和Python3搭建并维护统一认证系统OpenLdap
|
安全 测试技术 Android开发
Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试
Python自动化,大概也许或者是今年最具热度的话题之一了。七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那么Python自动化到底能帮我们做些什么呢? 第一,Python自动化可以避免熟练工种的重复工作,对于功能相对完整和成熟的软件,每发布一个新的版本,无论是大版本还是小版本,其中大部分功能和界面都几乎和上一个版本相似或完全相同,但所谓向上兼容,你不能因为新功能的产生而不对老版本功能进行测试工作,而这些老功能又在上一个版本上线时测过,所以这部分功能特别适合于自动化测试,从而可以让测试达到测试每个特征的目的。
Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试