歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用 Apache Commons CLI 開發命令行工具

使用 Apache Commons CLI 開發命令行工具

日期:2017/3/1 9:14:42   编辑:Linux編程

雖然各種人機交互技術飛速發展,但最傳統的命令行模式依然被廣泛應用於各個領域:從編譯代碼到系統管理,命令行因其簡潔高效而備受寵愛。各種工具和系統都提供了詳盡的使用手冊,有些還提供示例說明如何二次開發。然而關於如何開發一個易用、強壯的命令行工具的文章卻很少。本文將結合 Apache Commons CLI,通過一個完整的例子展示如何准備、開發、測試一個命令行工具。希望本文對有相關需求的讀者能有所幫助。

基於 Apache Commons CLI 的命令行設計

通常情況下命令行處理有三個步驟:定義,解析和詢問階段。本章節將依次解釋這三個步驟,並將結合實例來討論如何通過 Apache Commons CLI 來實現它們。由於本文作者一直從事和存儲相關的工作,所以我們將設計一個如何向 Server 中添加 / 刪除存儲數據源的 CLI。

以下是具體應用場景,用戶可以通過以下方式來添加/刪除通過 CIM (Common Information Model) Server 管理的存儲數據源:

  1. 添加通過 CIM Server 管理的存儲,例如添加 IBM DS Series,命令行設計如下:
     mkdatasource [-h | -? | --help] 
     mkdatasource [-t string] [-i string] [-p string] [-u string] [-w string] [-n string]
     -h 
     Lists short help 
     -t 
     Sets the HTTP communication protocol for CIM connection 
     -i 
    	 Sets the IPv4 address of the device 
     -p 
     Sets the HTTP communication port for CIM connection 
     -u 
    	 Specifies the user ID for the data source connection 
     -w 
    	 Specifies the password for the data source connection 
     -n 
    	 Identifies the namespace of the CIM connection 
    
     Examples: 
     Add CIM Storage Subsystem 
     mkdatasource –t http –i 9.3.194.11 –p 5988 –u admin –w admin –n root/lsiarray13
  2. 刪除通過 CIM Server 管理的存儲,例如刪除 IBM DS Series,命令行設計如下:
     rmdatasource [-h | -? | --help] 
     rmdatasource [-t string] [-i string] [-p string] 
    
     -h 
     Lists short help 
     -t 
     Sets the HTTP communication protocol for CIM connection 
     -i 
     Sets the IPv4 address of the device 
     -p 
     Sets the HTTP communication port for CIM connection 
    
     Examples: 
     Remove CIM Storage Subsystem 
     rmdatasource –t http –i 9.3.194.11 –p 5988

CLI 定義階段

每一條命令行都必須定義一組參數,它們被用來定義應用程序的接口。Apache Commons CLI 使用 Options 這個類來定義和設置參數,它是所有 Option 實例的容器。在 CLI 中,目前有兩種方式來創建 Options,一種是通過構造函數,這是最普通也是最為大家所熟知的一種方式;另外一種方法是通過 Options 中定義的工廠方式來實現。

CLI 定義階段的目標結果就是創建 Options 實例。

根據上面給出的具體命令行設計,我們可以用如下代碼片段為添加數據源操作定義 Options:

清單 1. 定義 Options 代碼片段
 // 創建 Options 對象
 Options options = new Options(); 

 // 添加 -h 參數
 options.addOption("h", false, "Lists short help"); 

 // 添加 -t 參數
 options.addOption("t", true, "Sets the HTTP communication protocol for CIM connection");

其中 addOption() 方法有三個參數,第一個參數設定這個 option 的單字符名字,第二個參數指明這個 option 是否需要輸入數值,第三個參數是對這個 option 的簡要描述。在這個代碼片段中,第一個參數只是列出幫助文件,不需要用戶輸入任何值,而第二個參數則是需要用戶輸入 HTTP 的通信協議,所以這兩個 option 的第二個參數分別為 false 和 true,完整的代碼及注釋請參考第二章節的命令行開發部分。

CLI 解析階段

在解析階段中,通過命令行傳入應用程序的文本來進行處理。處理過程將根據在解析器的實現過程中定義的規則來進行。在 CommandLineParser 類中定義的 parse 方法將用 CLI 定義階段中產生的 Options 實例和一組字符串作為輸入,並返回解析後生成的 CommandLine。

CLI 解析階段的目標結果就是創建 CommandLine 實例。

根據上面給出的具體命令行設計,我們可以用如下代碼片段為添加數據源操作解析 Options:

清單 2. 解析 Options 代碼片段
 CommandLineParser parser = new PosixParser(); 
 CommandLine cmd = parser.parse(options, args); 

 if(cmd.hasOption("h")) { 
    // 這裡顯示簡短的幫助信息
 }

我們需要判斷命令行中是不是有 h 參數,如果有,就需要應用程序列出簡短的幫助信息,完整的代碼及注釋請參考第二章節的命令行開發部分。

CLI 詢問階段

在詢問階段中,應用程序通過查詢 CommandLine,並通過其中的布爾參數和提供給應用程序的參數值來決定需要執行哪些程序分支。這個階段在用戶的代碼中實現,CommandLine 中的訪問方法為用戶代碼提供了 CLI 的詢問能力。

CLI 詢問階段的目標結果就是將所有通過命令行以及處理參數過程中得到的文本信息傳遞給用戶的代碼。

根據上面給出的具體命令行設計,我們可以用如下代碼片段為添加數據源操作詢問 Options:

清單 3. 詢問 Options 代碼片段
 // 獲取 -t 參數值
 String protocol = cmd.getOptionValue("t"); 

 if(protocol == null) { 
    // 設置默認的 HTTP 傳輸協議
 } else { 
 // 設置用戶自定義的 HTTP 傳輸協議 
 }

如果用戶設置了 t 參數,getOptionValue() 方法將獲取用戶設定的數值,如果沒有指定該參數,getOptionValue() 方法將返回 null,應用程序會根據返回的數值來決定代碼的運行,完整的代碼及注釋請參考第二章節的命令行開發部分。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-06/132607p2.htm

Copyright © Linux教程網 All Rights Reserved