How to parse command line arguments in Java.

網路上有很多專門處理參數的套件,而本文使用apache的commons-cli來做說明。

如果沒有這個套件請先下載: http://commons.apache.org/cli/download_cli.cgi

(例如撰寫此文時最新的版本是commons-cli-1.2-bin.zip)

解壓縮後,可用加入外部jar檔或其他方式,讓你的專案能夠使用這個套件。

接著你可以使用Options類別來定義可用的選項(Option)

Options options = new Options();
options.addOption(選項名稱, 選項別名, 是否帶參數, 選項描述);

例如:

Options options = new Options();
options.addOption("u", "username", true, "enter username");

你的程式將可接受-u或--username的選項

要將可用選項列出說明可使用HelpFormatter類別

HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( 程式名稱, options );
例如程式為Test.jar
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "Test.jar", options );
會輸出
usage: Test.jar
 -u,--username <arg>   enter username
取得參數則可使用以下方式:
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的第二個參數為取不到時的預設值

一個完整的範例如下:

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來做判斷,原理同Properties該篇所說。一些輸入和輸出結果如下:

輸入
java -jar -Test.jar
輸出
usage: Test.jar
 -b,--background       run in the background.
 -p,--password <arg>   enter password
 -u,--username <arg>   enter username
輸入
java -jar -Test.jar -u user --password 123 -b
輸出
Username: user
Password: 123
Background: true
輸入
java -jar -Test.jar -u user --password 123 -v
輸出
Unrecognized option: -v
usage: Test.jar
 -b,--background       run in the background.
 -p,--password <arg>   enter password
 -u,--username <arg>   enter username
文章標籤
創作者介紹

小殘的程式光廊

emn178 發表在 痞客邦 PIXNET 留言(0) 人氣()