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 Santana



Introdução

O 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).

Douglas Santana

Douglas Santana - Analista de TI da E-Consulting Corp.