Empaquetamiento de aplicaciones de escritorio (standalone) con Maven

En este tutorial vamos a aprender a empaquetar aplicaciones de escritorio con Maven para ser distribuidas

Empaquetamiento de aplicaciones de escritorio (standalone) con Maven

Introducción

Actualmente he tenido la necesidad de empaquetar una aplicación de escritorio construida con Maven y me he dado cuenta de que ninguna de las alternativas de empaquetamiento que este me ofrece era la que se ajustaba a mis necesidades.

Más concretamente, lo que no se ajustaba a mis necesidades es el modo en que Maven coloca las dependencias de tu proyecto a la hora de crear el paquete a distribuir.
Maven, mete todos los

Text
.class

de las dependencias de tu proyecto dentro del propio Jar de tu aplicación. (assembly

Text
jar-with-dependencies

).

Que queréis que os diga, a mi eso no me gusta. Prefiero tener mi jar (con el método main) por un lado con el MANIFEST modificado de tal forma que haga referencia los jars que necesita para ejecutarse.

Más concretamente, me gusta tener un directorio

Text
dist

en donde dentro está mi jar (con el método main) y las dependencias en un directorio

Text
dist/lib

.

Pues bien, en este ejemplo vamos a ver como conseguir ese método, siendo fácilmente adaptable a otro tipo de necesidades que tengáis.

Ejemplo, Aplicación básica de escritorio con dependencias:

A continuación vamos a ver como conseguir lo anteriormente expuesto, para ello nuestra aplicación de escritorio será muy básica y tendrá dos dependencias.

Eso si, el esfuerzo para una aplicación con miles de clases y decenas dependencias sería practicamente igual.. quizás sería necesario algún pequeño reajuste, pero vamos poco más.

El código fuente de este tutorial puede ser descargado desde aquí (proyecto Eclipse con Maven 2).

Entorno

El siguiente ejemplo está construido en el siguiente entorno:

  • HP Pavilion.
  • Windows Vista Home Premium.
  • Eclipse Ganymede.
  • Java 6.
  • Maven 2.
  • Plugin Maven 4QE para Eclipse.

Mi aplicación de escritorio con su bonito método main:

Está autocomentada, pero bueno, resalto que usa las librerías commons-lang y commons-io de Apache.

package com.autentia.tutoriales.maven.standalone;

import java.io.File;
import org.apache.commons.lang.WordUtils;
import org.apache.commons.io.FileUtils;

public class MavenStandaloneExample {
	/**
	 * Dado un archivo de texto imprime su contenido capitalizado, es decir, la primera letra de 
	 * cada palabra en mayúsculas.
	 * @param args Un sólo parámetro con la ruta completa al archivo de texto a capitalizar.
	 */
	public static void main(String[] args) {
		try {
			File	 file   = new File(args[0]);
			String fileContent = FileUtils.readFileToString(file);
			
			System.out.println(WordUtils.capitalizeFully(fileContent));
		} catch (java.lang.ArrayIndexOutOfBoundsException ex){
			System.out.println("Debe especificar el nombre de un archivo");
		} catch (java.io.IOException ex){
			System.out.println("Se ha producido un error al tratar el archivo especificado.");
			System.out.println("Verique que exista y que tenga permisos de lectura.");
		}
	}
}

Archivo de configuración de Maven 2:

Text
pom.xml

:

A continuación exponemos el archivo de configuración de Maven, se presupone que el lector ya tiene nociones de Maven.


	4.0.0
	com.autentia.tutoriales
	maven_standalone_app_example
	jar
	1.0-SNAPSHOT
	maven_standalone_app_example
	https://adictosaltrabajo.com

	
		
		mavenStandaloneExample

		
			
			
				maven-compiler-plugin
				
					1.5
					1.5
					UTF-8
				
			

			
			
				org.apache.maven.plugins
				maven-jar-plugin
				
					
						
							
							com.autentia.tutoriales.maven.standalone.MavenStandaloneExample

							
							true

							
							lib
						

						
						
							Carlos García Pérez
							Autentia Real Business Solutions
							http://www.autentia.com
						
					
				
			

			
			
				org.apache.maven.plugins
				maven-assembly-plugin
				
					
						maven_assembly_conf.xml
					
				
				
				
					
						package
						
							single
						
					
				
			
		
	

	
		
			commons-lang
			commons-lang
			2.3
		

		
			commons-io
			commons-io
			1.4
		
	

Archivo de configuración del assembly

Text
(maven_assembly_conf.xml)

:

El archivo está autocomentado.



	
	standaloneapp-dist-format

	
	
		
		dir
	

	
	../../dist

	
		
		
			target
			.
			
				*.jar
			
		
	

	
		
			
			lib

			
			false

			
			runtime

			
			
				${groupId}:${artifactId}
			
		
	

El archivo

Text
/META-INF/MANIFEST

generado:

Si abrimos el JAR veremos que nos ha generado el siguiente archivo MANIFEST:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: cgarcia
Build-Jdk: 1.6.0_11
Main-Class: com.autentia.tutoriales.maven.standalone.MavenStandaloneExample
Autor: Carlos García Pérez
Empresa: Autentia Real Business Solutions
url: http://www.autentia.com
Class-Path: lib/commons-lang-2.3.jar lib/commons-io-1.4.jar

Invocando la aplicación:

Y para terminar, vamos a ver como ejecutariamos la aplicación anterior:

java -jar mavenStandaloneExample.jar <Ruta completa a un archivo de texto>

Referencias

Conclusiones

Si os gusta mi forma de organizar el proyecto teneis un esqueleto fácilmente adaptable a vuestras necesidades.

En Autentia llevamos años trabajando con Maven para gestionar nuestros proyectos, si algún día necesitais ayuda o formación al respecto espero nos tengáis en cuenta.

Un saludo, espero que os haya parecido útil este tutorial.

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

cgpcosmad@gmail.com

Comentarios

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

22/06/2026

Juan Antonio Jiménez Torres

Vamos a instrumentalizar un SDD para un microservicio bancario. En este artículo sobre SDD - Spec Driven Development, instrumentalizado sobre OpenSpec vamos a construir una PoC de algo más serio que una tabla periódica. Un microservicio bancario muy simplificado que gestione cuentas y permita hacer transferencias

16/06/2026

Juan Antonio Jiménez Torres

Este es el segundo artículo sobre SDD, Spec Driven Development, instrumentalizado sobre OpenSpec. Pero esta vez nos acercaremos usando softwere gratuito. Por un lado OpenCode en lugar de ClaudeCode y usando el modelo gratuito Gemma4 de Google en lugar de otros de pago.

08/06/2026

Juan Antonio Jiménez Torres

Aprenderemos sobre SDD – Spec Driven Development instrumentalizado sobre OpenSpec. Haremos un primer acercamiento usando ClaudeCode con Sonnet, para luego, en un artículo posterior pasarnos a la versión gratuita de OpenCode con Gemma4