網路上有很多專門處理參數的套件,而本文使用 apache 的 commons-cli 來做說明。如果沒有這個套件請先下載(例如撰寫此文時最新的版本是 commons-cli-1.2-bin.zip)。解壓縮後,可用加入外部 jar 檔或其他方式,讓你的專案能夠使用這個套件。
接著你可以使用 Options
類別來定義可用的選項 (Option)
1 2
| Options options = new Options(); options.addOption(選項名稱, 選項別名, 是否帶參數, 選項描述);
|
例如:
1 2
| Options options = new Options(); options.addOption("u", "username", true, "enter username");
|
你的程式將可接受 -u
或 --username
的選項
要將可用選項列出說明可使用 HelpFormatter
類別
1 2
| HelpFormatter formatter = new HelpFormatter(); formatter.printHelp( 程式名稱, options );
|
例如程式為 Test.jar
1 2
| HelpFormatter formatter = new HelpFormatter(); formatter.printHelp( "Test.jar", options );
|
會輸出
1 2
| usage: Test.jar -u,--username <arg> enter username
|
取得參數則可使用以下方式:
1 2 3 4 5 6 7 8 9 10 11 12
| CommandLineParser parser = new PosixParser(); CommandLine cmd = null; String username; try { cmd = parser.parse( options, args); username = cmd.getOptionValue("u", ""); } catch (ParseException e) { System.err.println(e.getMessage()); formatter.printHelp( "Test.jar", options ); return; }
|
其中 getOptionValue
的第二個參數為取不到時的預設值
一個完整的範例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| 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; import org.apache.commons.cli.PosixParser;
public class Test {
public static void main(String[] args) { Options options = new Options();
options.addOption("u", "username", true, "enter username"); options.addOption("p", "password", true, "enter password"); options.addOption("b", "background", false, "run in the background.");
HelpFormatter formatter = new HelpFormatter(); CommandLineParser parser = new PosixParser(); CommandLine cmd = null; String username = ""; String password = ""; boolean isBackground = false; try { cmd = parser.parse( options, args); username = cmd.getOptionValue("u", ""); password = cmd.getOptionValue("p", ""); isBackground = cmd.hasOption("b"); } catch (ParseException e) { System.err.println(e.getMessage()); formatter.printHelp( "Test.jar", options ); return; }
if(username.isEmpty() || password.isEmpty()) { formatter.printHelp( "Test.jar", options ); return; }
System.out.println("Username: " + username); System.out.println("Password: " + password); System.out.println("Background: " + isBackground); } }
|
參數都給空字串作預設值可直接用 isEmpty
來做判斷,原理同 Java 讀取設定檔 該篇所說。一些輸入和輸出結果如下:
輸入
輸出
1 2 3 4
| usage: Test.jar -b,--background run in the background. -p,--password <arg> enter password -u,--username <arg> enter username
|
輸入
1
| java -jar -Test.jar -u user --password 123 -b
|
輸出
1 2 3
| Username: user Password: 123 Background: true
|
輸入
1
| java -jar -Test.jar -u user --password 123 -v
|
輸出
1 2 3 4 5
| Unrecognized option: -v usage: Test.jar -b,--background run in the background. -p,--password <arg> enter password -u,--username <arg> enter username
|