Apache Commons CLI - Guia rápido
O Apache Commons CLI são os componentes do Apache Commons derivados da API Java e fornecem uma API para analisar argumentos / opções de linha de comando que são passados para os programas. Esta API também permite imprimir ajuda relacionada às opções disponíveis.
O processamento da linha de comando compreende três estágios. Essas etapas são explicadas abaixo -
- Estágio de Definição
- Estágio de análise
- Estágio de interrogação
Estágio de Definição
Na fase de definição, definimos as opções que um aplicativo pode tomar e agir de acordo. Commons CLI fornece a classe Options, que é um contêiner para objetos Option.
// create Options object
Options options = new Options();
// add a option
options.addOption("a", false, "add two numbers");
Aqui, adicionamos um sinalizador de opção a, embora falso como segundo parâmetro, significa que a opção não é obrigatória e o terceiro parâmetro indica a descrição da opção.
Estágio de análise
No estágio de análise, analisamos as opções passadas usando argumentos de linha de comando após criar uma instância do analisador.
//Create a parser
CommandLineParser parser = new DefaultParser();
//parse the options passed as command line arguments
CommandLine cmd = parser.parse( options, args);
Estágio de interrogação
Na fase de interrogação, verificamos se uma determinada opção está presente ou não e, em seguida, processamos o comando de acordo.
//hasOptions checks if option is present or not
if(cmd.hasOption("a")) {
// add the two numbers
} else if(cmd.hasOption("m")) {
// multiply the two numbers
}
Neste capítulo, aprenderemos sobre a configuração do ambiente local do Apache Commons CLI e como configurar o caminho do Commons CLI para Windows 2000 / XP, Windows 95/98 / ME etc. Também entenderemos sobre alguns editores Java populares como baixar o arquivo Commons CLI.
Configuração de ambiente local
Se você ainda deseja configurar seu ambiente para a linguagem de programação Java, este capítulo o guiará sobre como baixar e configurar o Java em sua máquina. Siga as etapas mencionadas abaixo para configurar o ambiente.
Java SE está disponível gratuitamente no link https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html. Assim, você pode baixar uma versão com base em seu sistema operacional.
Siga as instruções para baixar o Java e execute o .exe para instalar o Java em sua máquina. Depois de instalar o Java em sua máquina, você precisará definir as variáveis de ambiente para apontar para os diretórios de instalação corretos.
Caminho para Windows 2000 / XP
Estamos assumindo que você instalou o Java em c:\Program Files\java\jdk diretório.
Clique com o botão direito em 'My Computer' e selecione 'Properties'.
Clique no 'Environment variables' botão sob o 'Advanced' aba.
Agora, altere o 'Path'variável, de modo que também contenha o caminho para o executável Java. Exemplo, se o caminho está atualmente definido para'C:\WINDOWS\SYSTEM32', então mude seu caminho para ler 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'.
Caminho para Windows 95/98 / ME
Estamos assumindo que você instalou o Java em c:\Program Files\java\jdk diretório.
Edite o 'C:\autoexec.bat' arquivo e adicione a seguinte linha no final - 'SET PATH=%PATH%;C:\Program Files\java\jdk\bin'.
Caminho para Linux, UNIX, Solaris, FreeBSD
A variável de ambiente PATH deve ser definida para apontar, onde os binários Java foram instalados. Consulte a documentação do shell, se tiver problemas para fazer isso.
Por exemplo, se você usar bash como seu shell, então você adicionaria a seguinte linha ao final de seu '.bashrc: export PATH = / path / to / java: $ PATH'
Editores Java populares
Para escrever seus programas Java, você precisa de um editor de texto. Existem muitos IDEs sofisticados disponíveis no mercado. Mas, por agora, você pode considerar um dos seguintes -
Notepad - Na máquina Windows você pode usar qualquer editor de texto simples como o Notepad (recomendado para este tutorial), TextPad.
Netbeans- É um IDE Java de código aberto e gratuito que pode ser baixado em www.netbeans.org/index.html .
Eclipse- Também é um IDE Java desenvolvido pela comunidade de código aberto eclipse e pode ser baixado de www.eclipse.org .
Baixar arquivo CLI comum
Baixe a versão mais recente do arquivo jar do Apache Common CLI em commons-cli-1.4-bin.zip . No momento de escrever este tutorial, baixamos commons-cli-1.4-bin.zip e o copiamos para a pasta C: \> Apache.
SO | Nome do arquivo |
---|---|
janelas | commons-cli-1.4-bin.zip |
Linux | commons-cli-1.4-bin.tar.gz |
Mac | commons-cli-1.4-bin.tar.gz |
Ambiente CLI comum do Apache
Colocou o APACHE_HOMEvariável de ambiente para apontar para o local do diretório base onde o jar do Apache está armazenado em sua máquina. Suponha que extraímos commonscollections4-4.1-bin.zip na pasta Apache em vários sistemas operacionais da seguinte forma -
SO | Resultado |
---|---|
janelas | Defina a variável de ambiente APACHE_HOME para C: \ Apache |
Linux | export APACHE_HOME = / usr / local / Apache |
Mac | export APACHE_HOME = / Library / Apache |
Variável CLASSPATH
Colocou o CLASSPATHvariável de ambiente para apontar para o local do jar CLI comum. Suponha que você tenha armazenado commons-cli-1.4.jar na pasta Apache em vários sistemas operacionais da seguinte forma -
SO | Resultado |
---|---|
janelas | Armazena bots AIML </ Defina a variável de ambiente CLASSPATH para% CLASSPATH%;% APACHE_HOME% \ commons-cli-1.4.jar;.; |
Linux | export CLASSPATH = $ CLASSPATH: $ APACHE_HOME / commons-cli-1.4.jar :. |
Mac | export CLASSPATH = $ CLASSPATH: $ APACHE_HOME / commons-cli-1.4.jar :. |
Vamos criar um exemplo de aplicativo baseado em console, cujo objetivo é obter a soma dos números passados ou a multiplicação dos números passados com base nas opções usadas.
Crie uma classe java chamada CLITester.
Exemplo
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
//***Definition Stage***
// create Options object
Options options = new Options();
// add option "-a"
options.addOption("a", false, "add numbers");
// add option "-m"
options.addOption("m", false, "multiply numbers");
//***Parsing Stage***
//Create a parser
CommandLineParser parser = new DefaultParser();
//parse the options passed as command line arguments
CommandLine cmd = parser.parse( options, args);
//***Interrogation Stage***
//hasOptions checks if option is present or not
if(cmd.hasOption("a")) {
System.out.println("Sum of the numbers: " + getSum(args));
} else if(cmd.hasOption("m")) {
System.out.println("Multiplication of the numbers: " + getMultiplication(args));
}
}
public static int getSum(String[] args) {
int sum = 0;
for(int i = 1; i < args.length ; i++) {
sum += Integer.parseInt(args[i]);
}
return sum;
}
public static int getMultiplication(String[] args) {
int multiplication = 1;
for(int i = 1; i < args.length ; i++) {
multiplication *= Integer.parseInt(args[i]);
}
return multiplication;
}
}
Resultado
Execute o arquivo, passando -a como opção e números para obter a soma dos números como resultado.
java CLITester -a 1 2 3 4 5
Sum of the numbers: 15
Execute o arquivo, passando -m como opção e números para obter a multiplicação dos números como resultado.
java CLITester -m 1 2 3 4 5
Multiplication of the numbers: 120
O objeto Opção é usado para representar a Opção passada ao programa de linha de comando. A seguir estão várias propriedades que um objeto Option possui.
Sr. Não | Nome (tipo) & amps; Descrição |
---|---|
1 | opt (String) Sequência de identificação da opção. |
2 | longOpt (String) Alias e string de identificação mais descritiva. |
3 | description (String) Descrição da função da opção. |
4 | required (boolean) Sinalize para verificar se a opção deve aparecer na linha de comando. |
5 | arg (boolean) Sinalize para verificar se a opção possui um argumento. |
6 | args (boolean) Sinalize para verificar se a opção leva mais de um argumento. |
7 | optionalArg (boolean) Sinalize para verificar se o argumento da opção é opcional. |
8 | argName (String) Nome do valor do argumento da instrução de uso. |
9 | valueSeparator (char) O valor do caractere usado para dividir a string do argumento. |
10 | type (Object) Tipo de argumento. |
11 | value (String) Valor da opção. |
12 | values (String[]) Valores da opção. |
Uma opção booleana é representada em uma linha de comando por sua presença. Por exemplo, se a opção estiver presente, então seu valor é verdadeiro, caso contrário, é considerado falso. Considere o exemplo a seguir, onde estamos imprimindo a data atual e se o sinalizador -t estiver presente. Então, imprimiremos o horário também.
Exemplo
CLITester.java
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("t", false, "display time");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
Calendar date = Calendar.getInstance();
int day = date.get(Calendar.DAY_OF_MONTH);
int month = date.get(Calendar.MONTH);
int year = date.get(Calendar.YEAR);
int hour = date.get(Calendar.HOUR);
int min = date.get(Calendar.MINUTE);
int sec = date.get(Calendar.SECOND);
System.out.print(day + "/" + month + "/" + year);
if(cmd.hasOption("t")) {
System.out.print(" " + hour + ":" + min + ":" + sec);
}
}
}
Resultado
Execute o arquivo sem passar nenhuma opção e veja o resultado.
java CLITester
12/11/2017
Execute o arquivo, passando -t como opção e veja o resultado.
java CLITester
12/11/2017 4:13:10
Uma opção de argumento é representada em uma linha de comando por seu nome e seu valor correspondente. Por exemplo, se a opção estiver presente, o usuário deve passar seu valor. Considere o seguinte exemplo, se estivermos imprimindo logs em algum arquivo, para o qual, queremos que o usuário insira o nome do arquivo de log com a opção de argumento logFile.
Exemplo
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
Option logfile = Option.builder()
.longOpt("logFile")
.argName("file" )
.hasArg()
.desc("use given file for log" )
.build();
options.addOption(logfile);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
// has the logFile argument been passed?
if(cmd.hasOption("logFile")) {
//get the logFile argument passed
System.out.println( cmd.getOptionValue( "logFile" ) );
}
}
}
Resultado
Execute o arquivo, passando --logFile como opção, nome do arquivo como valor da opção e veja o resultado.
java CLITester --logFile test.log
test.log
Uma opção de propriedades é representada em uma linha de comando por seu nome e suas propriedades correspondentes como sintaxe, que é semelhante ao arquivo de propriedades java. Considere o exemplo a seguir, se estivermos passando opções como -DrollNo = 1 -Dclass = VI -Dname = Mahesh, devemos processar cada valor como propriedades. Vamos ver a lógica de implementação em ação.
Exemplo
CLITester.java
import java.util.Properties;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
Option propertyOption = Option.builder()
.longOpt("D")
.argName("property=value" )
.hasArgs()
.valueSeparator()
.numberOfArgs(2)
.desc("use value for given properties" )
.build();
options.addOption(propertyOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
if(cmd.hasOption("D")) {
Properties properties = cmd.getOptionProperties("D");
System.out.println("Class: " + properties.getProperty("class"));
System.out.println("Roll No: " + properties.getProperty("rollNo"));
System.out.println("Name: " + properties.getProperty("name"));
}
}
}
Resultado
Execute o arquivo, passando as opções como pares de valores-chave e veja o resultado.
java CLITester -DrollNo = 1 -Dclass = VI -Dname = Mahesh
Class: VI
Roll No: 1
Name: Mahesh
Um analisador Posix é usado para analisar Posix como argumentos passados. Agora ele está obsoleto e foi substituído por DefaultParser.
Exemplo
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
public class CLITester {
public static void main(String[] args) throws ParseException {
//Create posix like options
Options posixOptions = new Options();
posixOptions.addOption("D", false, "Display");
posixOptions.addOption("A", false, "Act");
CommandLineParser posixParser = new PosixParser();
CommandLine cmd = posixParser.parse(posixOptions, args);
if( cmd.hasOption("D") ) {
System.out.println("D option was used.");
}
if( cmd.hasOption("A") ) {
System.out.println("A option was used.");
}
}
}
Resultado
Execute o arquivo passando -D -A como opções e veja o resultado.
java CLITester -D -A
D option was used.
A option was used.
Execute o arquivo passando --D como opção e veja o resultado.
java CLITester --D
D option was used.
Um analisador GNU é usado para analisar gnu como argumentos passados. Agora ele está obsoleto e foi substituído por DefaultParser.
Exemplo
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
//Create GNU like options
Options gnuOptions = new Options();
gnuOptions.addOption("p", "print", false, "Print")
.addOption("g", "gui", false, "GUI")
.addOption("n", true, "Scale");
CommandLineParser gnuParser = new GnuParser();
CommandLine cmd = gnuParser.parse(gnuOptions, args);
if( cmd.hasOption("p") ) {
System.out.println("p option was used.");
}
if( cmd.hasOption("g") ) {
System.out.println("g option was used.");
}
if( cmd.hasOption("n") ) {
System.out.println("Value passed: " + cmd.getOptionValue("n"));
}
}
}
Resultado
Execute o arquivo passando -p -g -n 10 como opção e veja o resultado.
java CLITester -p -g -n 10
p option was used.
g option was used.
Value passed: 10
Apache Commons CLI fornece a classe HelpFormatter para imprimir o guia de uso de argumentos de linha de comando. Veja o exemplo abaixo -
Exemplo
CLITester.java
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("p", "print", false, "Send print request to printer.")
.addOption("g", "gui", false, "Show GUI Application")
.addOption("n", true, "No. of copies to print");
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CLITester", options);
}
}
Resultado
Execute o arquivo e veja o resultado.
java CLITester
usage: CLITester
-g,--gui Show GUI Application
-n <arg> No. of copies to print
-p,--print Send print request to printer.
Apache Commons CLI fornece a classe HelpFormatter para imprimir a ajuda relacionada aos argumentos da linha de comando. Veja o exemplo.
Exemplo
CLITester.java
import java.io.PrintWriter;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("p", "print", false, "Send print request to printer.")
.addOption("g", "gui", false, "Show GUI Application")
.addOption("n", true, "No. of copies to print");
HelpFormatter formatter = new HelpFormatter();
final PrintWriter writer = new PrintWriter(System.out);
formatter.printUsage(writer,80,"CLITester", options);
writer.flush();
}
}
Resultado
Execute o arquivo e veja o resultado.
java CLITester
usage: CLITester [-g] [-n <arg>] [-p]