2017年5月26日 星期五

在 Java 設定 Command Line 參數:Apache Commons CLI 簡易使用(未完)

寫程式時,寫完的程式總是要被執行的。不過要怎麼被使用者執行呢?
現代來說,容易想到的就是做個 GUI 介面~
但實務上,很多小程式其實可能做 GUI 介面得花費的開發時間,甚至遠高於程式本身
而且 GUI 做出來有可能也只有兩三個按鈕,顯得挺不划算~。
因此,其實有相當多的程式,最後都還是會選擇最簡易的方式:以 Command Line 的形式讓使用者執行。

在 Java 中,main() 進入點都會有個 String[] args 的參數
這個陣列就是使用者在執行程式時,同時夾帶的 Command Line 參數。
當然我們可以自己去解析陣列的內容,但挺浪費時間。更好一些的作法,是使用已經有的現成函式厙。
而這裡要紀錄的,就是 Apache Commons CLI [1]。

以上是廢話 XD,是寫給剛從學校畢業或者還在學校學習程式的人~
因為遙想當年我還在學校時,我也一直搞不懂課堂上學的這些東西,要怎麼成為能夠跑的程式….囧rz

PS. 不過因為現在時間有限,暫時先紀錄一些有遇到還算常見的用法。

Apache Commons CLI 入門

請參考官網 [2]…(汗)
初步入門包含要怎麼設定參數、怎麼讀取參數,在 [2] 就可以看到了。
需要稍微注意的是,參數一定都是字串,所以程式需要特殊型別的話,大體上是要讀取參數值以後,再自己做反序列化。

如何建立含有多個值的 Option?

在某些狀況下,可能會想要讓使用者輸入多個 Value
例如可能我想讓使用者指定支援的 protocol,使用 –p 這個參數,然後使用者可以選擇 http、https、ftp、ftps 等等。
程式碼範例如下:

Option protocolOpt = new Option("p", true, "Protocols to be used.");
protocolOpt.setArgs(Option.UNLIMITED_VALUES);

Options options = new Options();
options.addOption(protocolOpt);
如何建立選擇性的 Option?

何謂選擇性的 Option 呢?意思就是某個參數可能會有 Value,但也可能不會有。
例如可能我想讓使用者指定某個路徑,但如果使用者沒指定,我可以使用預設值。
範例程式碼如下:

Option dirOpt = Option.builder("d")
    .desc("Path of the directory.")
    .hasArg()
    .optionalArg(true)
    .build();
	
Options options = new Options();
options.addOption(dirOpt);

這裡稍微需要注意的是,要同時指定 hasArg() 和 optionalArg(true),估計表示的意思是:這個參數會有 Value,但 Value 是選擇性的。
如果少了 hasArg(),則程式在取值時,永遠也取不到值;少了 optionalArg(true) 則會在沒給值的時候噴出 MissingArgumentException。

參考資料
  1. Apache Commons CLI
  2. Apache Commons CLI: Usage Scenarios

沒有留言: