Desenvolvimento - Java
Tratamento de opções e argumentos de linha de comando com o Commons CLI
Neste artigo, o autor faz uma demonstração da utilização do projeto Commons CLI.
por Douglas SantanaO Commons CLI (Command Line Interface) é um projeto do grupo Apache, que consiste de um conjunto de classes e interfaces para o tratamento de opções de linha de comando. Atualmente, ele conta com uma interface e com 17 classes (5 delas para o tratamento de exceções).
Para o melhor proveito desse artigo é um pré-requisito o conhecimento básico de linguagem Java.
O Site oficial do projeto está hospedado em http://jakarta.apache.org/commons/cli/.
Quem é ou já foi usuário de sistemas operacionais Unix (como o FreeBSD, AIX, Solaris, entre outros) ou do Linux já possui a experiência de trabalhar com as ferramentas de linha de comando, como por exemplo o rm, ln ls, mv, cp.
O programador com conhecimentos avançados em programação Unix, ao ler esse artigo, fará uma analogia à função getopt(), que é muito utilizada para o mesmo propósito em ambientes Unix.
Conceitos gerais
Basicamente, o processamento de linha de comando é composto de três estágios. São eles: definição, parsing e interrogação.
Na definição, um conjunto de opções é utilizado para definir a interface para a aplicação.
Durante o parsing, o conteúdo da linha de comando é enviado para a aplicação, que então é processado de acordo com as regras definidas pela implementação do parser.
A fase interrogação é aonde a aplicação consulta o objeto "CommandLine", para decidir o que deve ser executado.
Commons CLI na prática
Para executar o exemplo desse artigo, faça o download do Commons CLI em http://jakarta.apache.org/site/binindex.cgi. Posteriormente, descompacte o arquivo e coloque o "jar" no CLASSPATH da sua aplicação.
Até o fechamento desse artigo, a última versão estável utilizada para a elaboração do mesmo era a 1.0.
O código abaixo é auto-explicativo e contém comentários que facilitam sua compreensão.
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; /** Classe que demonstra o uso do Commons CLI * @author <a href="mailto:dsantana@ec-corp.com.br">Douglas F. Santana</a> * @version 1.0 */ public class ExemploCLI { public static void main(String[] args) { //Instancia a coleção que manterá as possíveis opções para a linha de comando Options opcoes = new Options(); //Instancia cada opção que pode ser utilizada na linha de comando //O primeiro parametro do construtor é a representação para a opção //O segundo parametro do construtor descreve a função da opção Option opcaoLinhaComandoJVM = new Option("j", "Exibe informacoes sobre a JVM"); Option opcaoLinhaComandoHelp = new Option("h", "Exibe os as formas de uso"); Option opcaoLinhaComandoOS = new Option("o", "Exibe informações sobre o sistema operacional"); //Adiciona cada opção na coleção de opções opcoes.addOption(opcaoLinhaComandoJVM); opcoes.addOption(opcaoLinhaComandoHelp); opcoes.addOption(opcaoLinhaComandoOS); //Instancia o parser CommandLineParser parser = new PosixParser(); try { //Efetua o parsing CommandLine cmd = parser.parse(opcoes, args); //Verifica se na linha de comando o usuário colocou a opção -j if (cmd.hasOption("j")) { imprimirInformacoesJVM(); } //Verifica se na linha de comando o usuário colocou a opção -o if (cmd.hasOption("o")) { imprimirInformacoesSO(); } //Verifica se na linha de comando o usuário colocou a opção -h if (cmd.hasOption("h")) { imprimirFormasUso(opcoes); } } catch (ParseException e) { System.err.println("Erro ao efetuar o parsing"); e.printStackTrace(); imprimirFormasUso(opcoes); } } private static void imprimirFormasUso(Options opcoes) { //Formata as mensagens de ajuda HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("ExemploCLI", opcoes); } private static void imprimirInformacoesSO() { System.out.println("Os name : " + System.getProperty("os.name")); System.out.println("Os arch : " + System.getProperty("os.arch")); System.out.println("Os version: " + System.getProperty("os.version")); } private static void imprimirInformacoesJVM() { Runtime runtime = Runtime.getRuntime(); System.out.println("Processadores disponíveis para a JVM: " + runtime.availableProcessors()); System.out.println("Java Runtime Environment version " + System.getProperty("java.version")); System.out.println("Java vendor: " + System.getProperty("java.vendor")); System.out.println("Java vendor URL : " + System.getProperty("java.vendor.url")); System.out.println("Java home : " + System.getProperty("java.home")); } }
Para testarmos o programa, basta compilarmos digitar a seguinte instrução na linha de comando, a fim de exibir dados sobre o sistema operacional que está sendo utilizado pela JVM:
ExemploCLI -o
A saída acima será (depende do Sistema Operacional) :
Os name : Windows XP
Os arch : x86
Os version: 5.1
Para mostrarmos as possíveis formas de uso, basta digitarmos:
ExemploCLI -h
A saída acima será (a classe HelpFormatter formata as mensagens de ajuda para as opções de linha de comando) :
usage: ExemploCLI
-h Exibe os as formas de uso
-j Exibe informacoes sobre a JVM
-o Exibe informações sobre o sistema operacional
Poderíamos digitar também "ExemploCLI -o -j" para exibirmos informações sobre a JVM e sobre o SO utilizado pela JVM.
Conclusão
O Commons CLI é uma API muito poderosa para o tratamento de opções de linha de comando, principalmente para o programador que desenvolve aplicativos para trabalhar com o console. Isso acaba tornando a aplicação muito flexível, lembrando muito os utilitários do mundo Unix. Para utilizar os recursos mais avançados da API é recomendada a leitura do JavaDoc e do tutorial disponível no Site do Projeto.
Nosso Propósito Grandioso é ajudar a inserir o Brasil no mercado global de conhecimento de negócios, ou seja, auxiliar o Brasil a aumentar e melhorar a qualidade e autenticidade do conhecimento de negócios aqui gerado. Lutamos diariamente para conseguir a admiração, respeito e reconhecimento de nossa sociedade, pois sabemos que Nosso Papel é constantemente transformar os diversos setores da economia e da sociedade, criando valor, categorias únicas e liderança, a partir do conhecimento competitivo aplicado aos negócios (Authentic Knowledge® for Business).