Tratamiento de líneas de comando mediante «Commons CLI»

Una tarea que inicialmente suelen realizar la gran mayoría de las aplicaciones es el análisis de los parámetros con los que el usuario ha invocado la aplicación. Es este tutorial Carlos Garcia va a realizar una presentación de una librería que nos facilit

Tratamiento de líneas de comando mediante «Commons CLI»

Una tarea que inicialmente suelen realizar la gran mayoría de las aplicaciones es el
análisis de los parámetros con los que el usuario ha invocado la aplicación.
Es este tutorial voy a realizar una presentación de una librería que nos facilitar enormemente esta tarea.

Apache Commons CLI

Apache Commons CLI (Command Line Interface) es una de las útiles librerías que forman parte de Apache Commons.

Esta librería es bastante ligera, unos 35Kb, por lo que no es descartable a pesar de que el análisis de los parámetros se suela realizar únicamente una vez al inicio de la aplicación.

Modo de empleo general

Normalmente el tratamiento de la línea de comandos se realiza en tres pasos:

  1. Definición
  2. Parseo
  3. Análisis del parseo
Definición

En esta etápa se define como será la línea de comando que acepte nuestra aplicación. Esta definición se realiza a través de las clases

Text
org.apache.commons.cli.Options

y

Text
org.apache.commons.cli.Option

de la librería

Por ejemplo, en el siguiente fragmento de código, definimos dos parámetros

Text
ip

y

Text
h

.

Options options = new Options();  
options.addOption("ip", true,  "IP de destino"); // Nombre del parámetro, ¿tiene que tener un valor asociado?, Descripción  
options.addOption("h",  false, "Imprime el mensaje de ayuda"); 
Parseo

En esta etapa la librería analizará automáticamente la línea de comandos según lo definido en la clase

Text
Options

Análisis del parseo

En esta etapa, debemos verificar que los valores de los parámetros son correctos, por ejemplo, que un parámetro requerido esté presente y tenga un valor válido.

Un ejemplo

En el siguiente fragmento de código (autocomentado), mostramos una pequeña aplicación cuya línea de comando se compone
de los siguientes parámetros:

Text
-ip address [-port puerto]  [err|console] [-help | -h]

En donde el único parámetro requerido es el parámetro

Text
ip

y en donde no pueden aparecer a la misma vez los parámetros

Text
console

y

Text
error

import org.apache.commons.cli.*;  
  
import java.io.OutputStream;  
  
/** 
 * Ejemplos del uso de la librería "Apache Commons CLI"  
 * @author Carlos García. Autentia. 
 */  
public class CommonsCliApp {  
  
    /** 
     * -ip address [-port puerto]  [err|console] [-help | -h] 
     */  
    public static void main(String[] args) {  
        final int DEF_PORT = 60001;     // Puerto por defecto  
          
        int               port    = 0;  
        String            ip      = null;     
        OutputStream      output  = null;  
        CommandLineParser parser  = null;  
        CommandLine       cmdLine = null;         
  
      ///////////////////////////////////////////////////////////////////////  
      // Fase 1: Configuramos las opciones de validación de entrada.  
      ///////////////////////////////////////////////////////////////////////  
              
        Options options = new Options();  
        options.addOption("ip",     true,  "IP de destino");  
        options.addOption("port",   true,  "Puerto destino");  
        options.addOption("h",      "help", false, "Imprime el mensaje de ayuda");   
          
        // No pueden aparecen las dos opciones simultáneamente.  
        OptionGroup group =  new OptionGroup();  
        group.addOption(new Option("err",     "Salida estándar de errores"));  
        group.addOption(new Option("console", "Salida estándar"));  
        options.addOptionGroup(group);  
          
          
        try {  
              
          ///////////////////////////////////////////////////////////////////////  
          // Fase 2: Parseamos la entrada con la configuración establecida  
          ///////////////////////////////////////////////////////////////////////  
        
            parser  = new BasicParser();  
            cmdLine = parser.parse(options, args);  
              
          ///////////////////////////////////////////////////////////////////////  
          // Fase 3: Analizamos los resultados y realizamos las tareas pertinentes  
          ///////////////////////////////////////////////////////////////////////  
              
            // Si está la opcion de ayuda, la imprimimos y salimos.  
            if (cmdLine.hasOption("h")){    // No hace falta preguntar por el parámetro "help". Ambos son sinónimos  
                new HelpFormatter().printHelp(CommonsCliApp.class.getCanonicalName(), options );  
                return;  
            }  
              
            // Si el usuario ha especificado el puerto lo leemos          
            if (cmdLine.hasOption("port")){  
                port = Integer.parseInt( cmdLine.getOptionValue("port") );    
            } else {  
                port = DEF_PORT;  
            }  
              
            // Leemos la dirección IP. Sino existe generamos un error pues es un parámetro requerido.  
            ip =  cmdLine.getOptionValue("ip");  
            if (ip == null){  
                throw new org.apache.commons.cli.ParseException("La direccion IP es requerida");  
            }  
              
            if (cmdLine.hasOption("console")){  
                output = System.out;  
            } else if (cmdLine.hasOption("err")){  
                output = System.err;  
            } else {  
                output = null;  
            }  
              
             // ..............................................................  
             // Aquí irían las tareas que tuviera que realizar la aplicación   
             // ..............................................................  
              
            System.out.println("OK");  
              
        } catch (org.apache.commons.cli.ParseException ex){  
            System.out.println(ex.getMessage());  
              
            new HelpFormatter().printHelp(CommonsCliApp.class.getCanonicalName(), options );    // Error, imprimimos la ayuda  
        } catch (java.lang.NumberFormatException ex){  
            new HelpFormatter().printHelp(CommonsCliApp.class.getCanonicalName(), options );    // Error, imprimimos la ayuda  
        }  
    }  
}  
Algunos ejemplos de invocació a la aplicación para ver la salida

(Suponemos que la librería

Text
commons cli

está en el

Text
CLASSPATH

)

Bueno, para terminar, recordaros que esto no es más que un tutorial introductorio a la librería. Si necesitais más información podeis dirigiros a la página oficial del proyecto.

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com

Comentarios

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Técnico especialista en informática de empresa (CEU). Ingeniero Técnico en Informática de Sistemas (UPM) Creador de MobileTest, Haaala!, Girillo, toi18n. Charla sobre desarrollo de aplicaciones en Android. @cgpcosmad

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

02/03/2026

José Antonio Sánchez Segovia

Zephyr es un RTOS open source respaldado por la Linux Foundation que permite desarrollar dispositivos embebidos conectados, eficientes y escalables, facilitando el paso de prototipo a producto final con una arquitectura mantenible.

23/02/2026

Enrique Casado Díez

LoRa y LoRaWAN son tecnologías clave en el ecosistema IoT cuando se requiere largo alcance y bajo consumo energético. En este artículo analizamos su funcionamiento, Spreading Factor, link budget, arquitectura de red, frecuencias y clases de dispositivos, con un caso práctico real.

19/02/2026

Juan José Díaz Antuña

Copilot Chat es la forma más sencilla y segura de empezar a usar IA en Microsoft 365. En este artículo vemos cómo funciona, cómo activarlo y en qué se diferencia de Microsoft 365 Copilot, Copilot Studio y los Agentes Inteligentes, con ejemplos prácticos y una comparativa clara.