網路上有很多專門處理參數的套件,而本文使用 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) {
// TODO Auto-generated catch block
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 {

/**
* @param args
*/
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) {
// TODO Auto-generated catch block
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
java -jar -Test.jar

輸出

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