Este artículo me lo han pedido una gran cantidad de veces. Alguna vez escribí sobre como incluir dependencias dentro de un JAR, pero aquel método no me gusta. Tiende a fallar a veces.
Cuando escribí aquel artículo aún no sabía o no tenía la costumbre de utilizar Maven en mis proyectos. Maven es un gestor de repositorios, extremadamente útil, que hará de tu vida programando en Java una experiencia mucho más sencilla.
Veamos un ejemplo de por qué y para qué se debe utilizar Maven. Cuando se crea un proyecto en Maven, este se diferencia de un proyecto Java común y corriente por la construcción interna del árbol de proyectos.
Cuando se crea un proyecto en Maven, en la raíz se encuentra un archivo llamado pom.xml. En dicho archivo se establecen algunos parámetros básicos del proyecto, como el nombre, la versión, la clase principal, entre otros. También se establecen las dependencias y repositorios que se van a utilizar. Esta característica es especialmente útil, puesto que solo basta con escribir el nombre del repositorio o la dependencia que necesitas y Maven lo descargará e instalará automáticamente.
Por ejemplo, la librería PanamaHitek_Arduino puede ser descargada e instalada fácilmente agregando las solamente unas cuantas líneas de texto al archivo pom. Lo mismo aplica a casi cualquier repositorio de Java hoy por hoy.
Si queremos agregar la librería JFreeCharts, para hacer gráficas, agregamos lo siguiente al pom:
1 2 3 4 5 |
<dependency> <groupId>jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.13</version> </dependency> |
Maven es muy sencillo de utilizar. Facilita tu vida y te permite llevar un orden en los repositorios que utilizas.
Creando JAR ejecutable con Maven
Otra característica importante de Maven es la capacidad de crear ficheros JAR ejecutables a través de la inclusión de todas las dependencias dentro de un solo archivo. Para ello basta con agregar las siguientes instrucciones al archivo pom:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<build> <finalName>NOMBRE_DEL_PROYECTO</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <downloadSources>true</downloadSources> <downloadJavadocs>false</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> //Versión de JDK con la cual se ha construido el proyecto // 1.8 significa que se utilizó Java8 <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <configuration> <descriptorRefs> //Sufijo que se le agregara al fichero JAR ejecutable <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> //Aqui se establece el nombre de la clase principal <mainClass>com.MainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> |
Solo basta con modificar las líneas de NOMBRE_DEL_PROYECTO y establecer correctamente la clase principal. Estas instrucciones deben agregarse al final del archivo pom.xml, justo antes de la etiqueta </project>. Luego de eso, solo basta con hacer click derecho en el proyecto y seleccionar «Clean and Build» en Netbeans. Al hacer la compilación, aparecerán 2 archivos JAR, uno sin dependencias y el otro con dependencias.
Por supuesto que el archivo con dependencias pesa mucho más que uno sin dependencias. La ventaja de esto es que se podrá ejecutar donde sea, en cualquier sistema operativo sin necesidad de estar creando carpetas y descargando ficheros.
Si quieren ver un ejemplo del uso de este método, les recomiendo el proyecto ArduinoSwitch, una sencilla aplicación para encender un LED en Arduino desde Java. Lo pueden encontrar en nuestro repositorio de Github.
Cuando se descarga el proyecto y se compila, habrá dos archivos en la carpeta proyecto\ArduinoSwitch\Java\ArduinoSwitch\target. Estos son ArduinoSwitch.jar y ArduinoSwitch-jar-with-dependencies.jar.
Espero que la información presentada sea de utilidad para ustedes. Cualquier comentario, duda o sugerencia me la hacen llegar a través de la caja de comentarios.
buenas noches,tengo un pequeña duda pues agrego todo como dices pero al crearme esos dos ficheros no se me abre la aplicacion, dime si tiene alguna otra sugerencia que aparte de eso deba agregar ,soy nuevo trabajando con maven,saludos y disculpe las molestias causadas
Si quieres saber el error que está deteniendo la ejecución de tu aplicación te recomiendo que vayas a la carpeta donde tienes el JAR generado, presiones CONTROL + CLIC DERECHO DEL MOUSE sobre la carpeta y abras una ventana de Power Shell. Luego ejecutas el JAR utilizando el comando java -jar archivo.jar
Al hacer eso estarás ejecutando tu JAR desde la consola y si se produce algún error en tiempo de ejecución podrás verlo en la propia consola de Power Shell.
Hola, me queda la duda de cómo establecer correctamente el nombre de la clase main ¿qué debo poner ahí? Disculpa si mi pregunta suena algo absurda, pero soy muy nuevo programando, soy químico no programador.
Gracias de antemano.
Tu proyecto debe tener una clase principal, la primera que se ejecuta al iniciar el código. Esa clase está dentro de un paquete. Normalmente a los paquetes se les asigna la nomenclatura com.nombre_del_proyecto. Si tu proyecto se llama, por ejemplo, «Proyecto», creas un paquete llamado com.proyecto y ahí dentro colocas la clase principal. Recomiendo que la llames MainClass.
Entonces, en el POM estableces que tu clase principal es com.proyecto.MainClass
Va, eso ya salió, e, problema ahora es que si tengo conectado arduino me tira un error y crea un archivo .log, si lo ejecuto sin conectar el arduino se abre el programa, luego le conecto el arduino pero ya no ejecuta las órdenes que le di.
Eso posiblemente es un error en tu algoritmo. Yo he probado esto antes y funciona. Te invito a que compiles este proyecto y veas que si funciona:
https://github.com/PanamaHitek/ArduinoSwitch
Buenas tardes, me surgió el mismo problema de Eduardo, NetBeans sí me genera los archivos .jar, pero cuando los ejecuto no me abre la aplicación. Luego de tratar de ejecutar el .jar, lo quiero volver a construir desde NetBeans pero me marca error porque el archivo está abierto, eso se soluciona cuando finalizo el proceso del .jar desde el administrador de tareas o reiniciando la pc. Traté de correrlo desde la ventana de comandos, pero no pasa nada, ni lo abre ni marca error, luego descargué el archivo de ejemplo de encender y apagar un led con arduino, y todo funcionó a la perfección, el .jar lo ejecuta y lo abre bien, estuve comparando los dos proyectos (el de arduino y el mío) y no encuentro diferencias, en mi proyecto ya también tengo declarada la clase principal y todo, alguien sabe que pueda ser?
Nota: pasa los mismo cuando intento crear los archivos .jar de otros proyectos hechos con java sin maven. Se crea el .jar pero no se abre la aplicación.
Gracias por su tiempo.
Posiblemente es porque tienes que establecer el nombre de la clase principal para que Java sepa que fichero debe ejecutar al principio del tiempo de ejecución
Hola, al parecer era un problema con una clase que descargué para ajustar automáticamente las dimensiones de las imágenes al tamaño de las etiquetas que las contenían. Cuando quité esa librería el .jar ya abrió. En lugar de la librería usé un método propio de la clase ImageIcon (no sabía que existía ese método) y funcionó, el .jar continuó abriendo sin problemas.
El problema que surgió después es que cuando ejecuto el .jar las imágenes no las abre, a menos que ponga el .jar en la carpeta de source del proyecto de netBeans.
Lo que yo hice fue guardar las imágenes que utilicé dentro de un paquete llamado Imagenes en el proyecto de netBeans, pero al parecer esas imágenes no se agregaron al archivo .jar. Hay una forma especial de agregar las imágenes al proyecto de NetBeans para que se guarden en el archivo .jar?
Saludos.
Es mi primera vez trabajando con java with Maven y cuando intento ponerle un ícono a un label no me encuentra el path donde está la imágen que quiero poner como ícono. ¿Hay alguna forma especial de hacerlo? Ya busqué pero ninguna cosa me ha funcionado.
Te comparto un ejemplo: jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/app_icon/back_button.png»)));
Los archivos se guardan en la carpeta src/main/resources
En mi ejemplo coloqué una carpeta que se llama app_icon y dentro de ella puse una imagen llamada back_button.png
Lo que te mostré es la manera correcta de referirte al archivo que necesitas. Todo se guarda en «resources»
Muchas gracias por tu aporte, fue de utilidad.
Muchas Gracias!!!!
Hola, disculpen tengo una pregunta, NetBeans sí se me genera el .jar con dependencias incluidas, he abierto el .jar con winrar, y veo que las imágenes y las clases se encuentran dentro del .jar. Sin embargo, cuando lo quiero ejecutar sale el siguiente error: A Java exception has ocurred. En una ventana que tiene como título: Java Virtual Machine Loader.
El detalle es que aplicación en netbeans se ejecuta bien, no se genera ningún error, solo cuando quiero abrir el ejecutable.
Tengo el jdk y el jre 1.8.
NetBeans 11.1.
En el proyecto, en propiedades-> fuentes tengo 1.8 y UTF-8
Anteriormente de la misma aplicación generaba ejecutables que funcionaban, solo que ahora le he agregado imágenes y ahora sale el error, sin embargo en NetBeans funciona bien.
También he creado ejecutables de otros proyectos que contienen imágenes y funcionan bien. Entonces no sé que pueda ser, al principio pensé que las imágenes que había agregado al proyecto eran el problema, pero probé con otros proyectos con imágenes y veo que funcionan bien.
Alguien tiene una idea de lo que pueda estar pasando?
Saludos y gracias
Hola a todos, solo para informar que ya encontré el problema, les pido una disculpa por disponer de su tiempo, lo que pasa es que a veces cuando estás cansado por más que el error esté en frente de ti no lo ves. En mi caso tenía varias horas revisando y no lo encontraba, hasta que sucumbí a la desesperación y quise preguntar xD.
El problema obviamente estaba en las imágenes que agregué al proyecto. Estuvo de manera concreta en las ruta que hacía referencia una imagen, se me fue una diagonal «/» de más. El detalle era que esa imagen era muy pequeña, por lo tanto cuando ejecutaba la aplicación no me daba cuenta que no aparecía, porque había muchas imágenes de mayor tamaño que se mostraba en la aplicación.
Así mismo, NetBeans no marcaba error lo que hacía era simplemente no mostrarla.
Una vez que corregí la ruta de esa imagen el .JAR se ejecutó sin problemas.
Literal duré horas atorado por una diagonal «/» T.T
Gracias a todos los que se tomaron el tiempo en leer y tratar de ayudar.
Excelente. Gracias por compartir
Tienes que setear el JDK 1.8 tanto en Source como en Compiler. Parece que el compilador está usando Java 11
Muchísimas gracias por la info me sirvió de mucho c:
Genial. Tenía tiempo buscando la manera de crear un jar ejecutable con dependencias incluidas con Maven y este dato me funcionó. Muchas gracias.
Gracias por compartir esta info, me ayudo a resolver el problema que tenia de no tener mi jar con dependencias, funciono a la perfeccion tu guia. Mil gracias!!
Fiuu, me salvaste el semestre, muchas gracias por el aporte
Que grande, después de horas buscando tu solución es la única que me funcionó, muchas gracias por la info. Pongo un error que tuve por si a alguien le pasa. A mí no me ejecutaba porque el icono de la ventana que le tenía ajustado no era .ico, si no que era un .png y me saltaba un error. Un saludo.