En este post les mostraré como crear un archivo JAR con librerías eternas incluidas. Resulta que para muchos es muy difícil crear aplicaciones en Java cuando las mismas requieren el uso de librerías externas. A la hora de la compilación, el archivo JAR resultante debe estar en una carpeta junto a sus librerías. De lo contrario le sería imposible ejecutarse. Pero, ¿que tal si eliminamos esta limitante? Esto se puede lograr con los procedimientos que voy a mostrar a continuación.
Voy a utilizar como ejemplo el proyecto ArduinoSwitch.
Como se puede observar, las librerías RXTX y Arduino están entre las librerías utilizadas por este proyecto. Si se compila el código, se obtiene lo siguiente.
Como se puede observar, se genera el archivo ArduinoSwitch.jar junto con la carpeta lib, donde se incluye las librerías Arduino y RXTX. Para que el archivo ArduinoSwitch se pueda ejecutar de forma correcta, debe estar acompañado de la carpeta lib.
Ahora voy a mostrar como crear un archivo JAR con librerias externas incluidas en su interior. Esto quiere decir que no será necesaria la carpeta lib para poder ejecutar ArduinoSwitch.
Es necesario dar clic donde dice «files» en la parte de la izquierda. Se despliega el arbol con las carpetas y se busca el archivo build.xml.
Hay que agregar unas instrucciones al código del build.xml. Dichas instrucciones son las siguientes:
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 |
<target name="-post-jar"> <property name="store.jar.name" value="Nombre_del_proyecto"/> <property name="store.dir" value="dist"/> <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/> <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/> <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> <zipgroupfileset dir="dist" includes="*.jar"/> <zipgroupfileset dir="dist/lib" includes="*.jar"/> <manifest> <attribute name="Main-Class" value="${main.class}"/> </manifest> </jar> <zip destfile="${store.jar}"> <zipfileset src="${store.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/> </zip> <delete file="${store.dir}/temp_final.jar"/> <delete dir="${store.dir}/lib"/> <delete file="${store.dir}/README.TXT"/> </target> |
En la siguiente imagen se muestra donde se debe colocar el código, y algunas pequeñas modificaciones:
Donde dice JAR_comprimido se escoge el nombre que se desea que tenga el JAR. Si se compila el proyecto, en la carpeta dist se obtendrá lo siguiente:
Se generan dos archivos, ArduinoSwitch, que es basura. Este archivo no se puede ejecutar porque no cuenta con la carpeta lib. Al archivo JAR_comprimido es el que es válido. Se puede notar que es más pesado (69 KB) que el otro archivo (11 KB), debido a que posee en su interior las librerías Arduino y RXTX.
Este archivo puede ejecutarse desde cualquier directorio. Es totalmente independiente de cualquier carpeta donde se contenga las librerías utilizadas por el proyecto.
Eso es todo por ahora.
Espero que la información suministrada sea de su agrado.
Saludos.
muy buen post, gracias antony.
A la orden
La versión 2.7.3 no incluye DLL
Exelente post me ayudo con el problema de las librerías.
me gusta esta solucion
Hay soluciones mejores, como utilizar Maven. Escribiré sobre eso uno de estos días
No puedo abrir el archivo jar por terminal, me sale este mensaje
↓↓
Error: no se a encontrado o cargado la clase principal
↑↑
Y cuando lo quiero abrir solo dándole clik, se abre el terminal y se cierre demasiado rápido.
¿Como podría solucionar eso?
Gracias de antemano
Tienes que tener cuidado con el nombre de la clase principal. Son configuraciones de Netbeans
Ahora me sale ese error al momento de compilar
Exception in thread «AWT-EventQueue-0» java.lang.NullPointerException
Can’t find bundle for base name jdbc, locale es_ES
Error al conectar
———————————–
Tengo dos proyectos, a uno lo ordene en un solo paquete y ya puede ejecutar el jar por terminal, pero no me conectaba y probé compilado en netbeans y me tira ese error.
Y el segundo proyecto lo tengo ordenado en paquetes y ese conecta sin problemas, no me sale ningun error, no se a que se debe. Espero me puedas ayudar
Adjunto fotos del error y de los dos proyectos.
https://uploads.disquscdn.com/images/20231bec7be5f0c4d9623eea526e35852fca8e6489458057388f0146c1c9fd13.png https://uploads.disquscdn.com/images/0850a79b2ed4dd5dd03910d5939f897330894f08c282084a28d399ea2aa8978f.jpg
https://uploads.disquscdn.com/images/68aaec80b70c0c82a6d2b53298decd6309f475c9d7eec2bfc2e24e412ea0bf97.jpg
los .jar ya llaman a las librerias en automatico?
Para eso se usa Maven
¡Excelente aporte, gracias!
Muchas Gracias!
HAY UNA LIBRERIAS QUE NO ME LAS TOMA COMO PODRIA SOLUCIONAR LO
Utiliza Maven: https://panamahitek.com/jar-ejecutable-con-dependencias-incluidas-en-java/
hola , tengo un problema mi programa al abrir tiene varias opciones, la opcion referentes a usuarios, la opcion referente a las ventas diarias, la de alimentos, la de caja registrdora y la de ayuda, al compilar el jar con dependencias incluidas, me abren todas las opciones excepto la de los usuarios, pero al ejecutarla desde el netbeans o en el jar sin dependencias con las librerias en el mismo sitio me funciona bien, alguien tiene alguna idea de a que se debe esto ??
Muchísimas gracias, excelente, ese código
Muchas gracias a este post, logré solucionar el problema de insertar las librerias externas en un jar. El único problema es que ese jar solo quiere abrir en la PC donde está el proyecto, en otras PC aunque tengan instalada la máquina virtual de Java no pasa de la vista de la clase principal
Debes verificar en la consola cual es tu fuente de error. Yo he logrado crear software que es capaz de ser ejecutado en múltiples computadoras y en múltiples sistemas operativos.
Saludos.