jump to navigation

Crear un unico JAR marzo 21, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
trackback

“Un One-jar unico, Un One-jar para encontrarlos a todos y atarlos en las tinieblas”.
(Perdonar la gracia, no he podido resistirme).

One-jar es una solucion que nos permite usar un unico jar para unir todas nuestras dependencias y hacer mas facil la distribucion de nuestras aplicaciones entre maquinas. Especialmente cuando nuestra aplicacion depende de multiples ficheros .jar. La idea es usar un unico fichero .jar.

Imaginate por ejemplo un proyecto que estas desarrollando y que internamente usa
estas tres librerias: log4j.jar, dom.jar y mysql.jar
Cuando quisieras llevar ese proyecto a otra maquina tendrias que mover 4 ficheros:
el de tu proyecto, p.ej si lo compilas y empaquetas como Miapp.jar
y esas otras 3 librerias.
Ademas tendrias que configurar el CLASSPATH para apuntar a esas librerias o incluir un fichero de manifiesto en Miapp.jar que indicara la ruta de las mismas. No seria mas sencillo tener un unico JAR con el codigo de tu aplicacion y que incluyera todo lo que necesitas utilizar. De eso trata One-jar.
Basicamente, se trata de un boot-loader que cuando lo inicializas carga en memoria todas las librerias que utilizas y ya no te da el conocido error de “Class Not Found” cuando intentas ejecutar tu aplicacion.

onejar03.jpg

Para utilizar one-jar descargate el siguiente fichero de su pagina web: one-jar-boot-0.95.jar

Tienes que montar una estructura de carpetas similar a la siguiente:

Cras una carpeta Tu_Proyecto y en ella añades lo siguiente:

Las clases de one-jar (las que resultan al descomprimir one-jar-boot-0.95.jar)

una Carpeta Main con el .jar de tu aplicacion (y que incluye internamente su manifiesto)

una Carpeta Lib (Las librerias que usas)
y el manifiesto de one-jar

Es decir,
tendras una carpeta Main donde dejaras el .jar de tu proyecto. Imaginate que tu proyecto se llama Miapp.jar, pues lo añades en esa carpeta sin olvidar de incluir el Manifiesto que es un fichero de esta
forma:

Manifest-Version: 1.0
Main-Class: <tu clase Main>
Class-Path: <las librerias que usas>

Es decir, este fichero de manifiesto tiene 3 entradas, en una de ellas (Main-Class) indicas la clase principal que quieres ejecutar, y en otra (Class-Path) indicas las librerias de las que depende, y que necesita para poder ejecutarse.

En la carpeta Lib añadirias todos esos .jar adicionales que usas. y por ultimo el manifiesto de one-jar que te encuentras al descomprimir el fichero descargado.

Con todo eso crearias un nuevo jar que empaquetas con el mismo nombre p.ej MiApp.jar de manera que al ejecutarlo con:

java -jar MiApp.jar

realmente se llama a la clase proncipal de one-jar que se encarga de cargar en memoria los .jar que usas y despues llama a tu clase principal. El resultado, se ejecuta tu clase principal y no necesita buscar los .jar adicionales porque ya estan cargados.

Es un poco complicado, Veamos de manera rapida como utilizarlo.

Yo tengo este proyecto:

mi clase principal se llama: comun.util.unix.ScriptActionExecution

y depende de estas librerias:

bsh-2.0b4.jar
profiler.jar
jsch-0.1.20.jar
log4j-1.2.8.jar
jdom.jar

El fichero de manifiesto (“MANIFEST.MF”) que tengo para mi aplicacion es:


Manifest-Version: 1.0
Main-Class: comun.util.unix.ScriptActionExecution
Class-Path: bsh-2.0b4.jar profiler.jar jsch-0.1.20.jar log4j-1.2.8.jar jdom.jar

onejar01.jpg

El fichero build.xml de ANT para generarlo podria ser el siguiente:


<?xml version="1.0"?>
<project name="clienteSSH" default="init" basedir=".">
<property name="fuente" value="." />
<property name="doc" value="javadoc" />
<property name="paquetes" value="comun.util.unix.*" />
<!-- textos relativos al proyecto -->
<property name="proyecto" value="clienteSSH" />
<property name="copyright" value="(k) 2005" />
<property name="jarfile" value="Main.jar" />
<target name="init">
<tstamp/>
<property name="nombre" value="Definiciones para Tareas"/>
<echo message="------------------- ${nombre} ----------------"/>
<property name="debug" value="on"/>
<property name="optimize" value="off"/>
<property name="deprecation" value="off"/>
<property name="build.compiler" value="classic"/>
<property name="target.vm" value="1.3"/>
<path id="classpath">
<fileset dir="./lib">
<include name="*.jar"/>
</fileset>
</path>
</target>
<target name="compilar" depends="init">
<echo message="-------------- Compilando Clases --------------"/>
<mkdir dir="build"/>
<javac srcdir="."
destdir="./build"
debug="${debug}"
optimize="${optimize}"
deprecation="${deprecation}"
target="${target.vm}">
<classpath refid="classpath"/>
</javac>
</target>
<target name="jar" depends="compilar">
<echo message="-------------- Generando Archivo JAR --------------"/>
<jar jarfile="Main.jar" manifest="./MANIFEST.MF" basedir="./build" includes="**"/>
</target>
<target name="limpiar" depends="compilar" >
<delete file="Main.jar"/>
</target>
<target name="limpiardoc">
<!--
Eliminamos los directorios de la vez anterior.
Eliminamos los dos juntos para no favorecer que
existan versiones de docuemntacion que no se
corresponden con las clases compiladas y viceversa
-->
<delete dir="${doc}" />
</target>
<target name="documentar" depends="limpiardoc">
<!--
Creamos el directorio si no existe. Y no existira porque
lo hemos eliminado con el objetivo limpiar, del cual
depende documentar
-->
<mkdir dir="${doc}" />
<!--
Generamos la documentcion de nuestro proyecto.
Los atributos de esta clase son incontables, asi
que ahora solo mostreré unos pocos. Consultar la
documentación de Ant y de javadoc si necesitais
algo más.
-->
<javadoc packagenames="${paquetes}"
sourcepath="${fuente}"
destdir="${doc}"
author="true"
version="true"
private="true"
locale="es"
windowtitle="API de ${proyecto}"
doctitle="${proyecto}"
bottom="${copyright}"
/>
</target>
<target name="one-jar" depends="jar" description="Build one ONE-JAR">
<property name="onejardir" location="./one-jar"/>
<mkdir dir="${onejardir}/main"/>
<mkdir dir="${onejardir}/lib"/>
<copy tofile="${onejardir}/${jarfile}"
file="lib/one-jar-boot-0.95.jar"/>
<copy todir="${onejardir}/main"
file="./${jarfile}"/>
<copy todir="${onejardir}/lib" flatten="true">
<fileset dir="lib" includes="*.jar"
excludes="one-jar-boot-0.95.jar"/>
</copy>
<jar jarfile="${onejardir}/${jarfile}" update="true"
basedir="${onejardir}" excludes="${jarfile}"/>
</target>
</project>

Disculpad el fichero ANT (lo he recuperado de hace unos cuantos añitos) seguro que es mejorable, pero de todas formas es funcional.

Aqui la tarea que nos interesa es “one-jar” pues al ejecutarla desde eclipse se me genera ya el fichero unico .jar con todas las dependencias incluidas. Que hace, pues lo que os comente al principio.

Me copia la estructura de lib/one-jar-boot-0.95.jar, tambien me añade al directorio “main” el .jar de mi aplicacion original (incluyendo
su fichero de manifiesto) y por ultimo añade a la carpeta “lib” todos esos .jar de los que depende mi aplicacion.
Y me genera un .jar nuevo (y unico) con el mismo nombre que el que haya configurado en la propiedad ${jarfile} que en este caso es
“Main.jar”

y para ejecutarlo me lo llevo el .jar recien generado a cualquier maquina con el JRE correspondiente y lo invoco como java -jar Main.jar (no hay problemas ya de Class not found)

onejar02.jpg

Mas informacion

Comentarios»

1. Sinhue - junio 13, 2007

Pesimamente mal explicado

2. superpiwi - junio 14, 2007

Lamento que no te ayudara. A mi si, por lo menos cuando tenga que hacer algo parecido recurrire a la pagina y ya me acordare de los pasos.Y creo que a otra persona tb le puede ayudar algo. Si no lo hubiera escrito, te aseguro que se me olvidaria y ahi si que no tendria nada que hacer. Tampoco conte con mucha documentacion en su dia, sino que fue mas de ensayo y error. Lo unico que disponia por entonces es del link que aparece abajo en la pagina y si lo compruebas veras que tampoco es que sea muy explicito. Un saludo.

3. Romualdo - julio 5, 2007

Como fue que lo hechaste andar???, ya segui los pasos pero no me funciona. Uso Java 5 y cuando compila tiene errores, los corrijo y me saca un error de reflection cuando ya armo el JAr.

4. PANTANO - julio 12, 2007

ROMUALDO, ERES DO BRASIL?

5. superpiwi - julio 18, 2007

a mi me funciona, pero voy a intentar revisar esto y actualizar el post.

6. Hugo - septiembre 18, 2008

espero me puedan ayudar, yo segui los pasos y me genero el jar bien, al ejecutar el sistema, se ejecutabien, pero cuando lo quiero usar, o sea quiero ejecutar una de las opciones lanza un error. Yo uso JPOX como persistencia, y parece que el problema esta ahi. Log4j me registra esto:

[18-09-2008] [14:21:07,828] (RMI TCP Connection(2)-127.0.0.1) WARN [JPOX.Plugin] – Could not find MANIFEST.MF file for plugin file onejar:lib/jpox-rdbms-1.2.0.jar/plugin.xml so ignoring it
[18-09-2008] [14:21:07,828] (RMI TCP Connection(2)-127.0.0.1) WARN [JPOX.Plugin] – Could not find MANIFEST.MF file for plugin file onejar:lib/jpox-core-1.2.0.jar/plugin.xml so ignoring it
[18-09-2008] [14:21:07,828] (RMI TCP Connection(2)-127.0.0.1) WARN [JPOX.Plugin] – Could not find MANIFEST.MF file for plugin file onejar:lib/jpox-enhancer-1.2.0.jar/plugin.xml so ignoring it

el prblema es que no se conecta a la base de datos. Espero me puedan ayudar. Saludos.

7. Sterling Diazd - agosto 9, 2011

Como no pudiste evitar escribir el slogan de este articulo, asi no pude resistir oir esa voz que pronuncia esa frase. Esa mujer de voz misteriosa.

8. Carlos - octubre 20, 2011

Hola bro no te entendi nada pero veo que alguunos si les ha funcionado por lo tanto tiene validez toda esa carreta de arriba. Bueno lo que estoy buscando es hacer una multiapplicacion osea una en donde vengn otras subapp por ejemplo yo tengo el MadaraxJava_Modt_Editor.jar seguro que ya lo conoces sirbe para editar app .jar desde el celular pero donde se encuentran otros subjar osea como: ClassEditor.jar, MobyExplorer.jar, MiniComander.jar y otras mas y lo que quiero hacer es uno igual pero con Facebook.jar, FacebookChat.jar, Ebuddy.jar y otras redes sociales es que tengo el Nokia C3 y no posee multi tarea y al hacer un multijar no tendria problemas en minimizar una app y entrar a otra. Nececito tu ayuda te puedes comunicar al siguiente correo carpa.93@gmail.com

9. 5point.info - octubre 19, 2012

Can I simply say what a relief to discover somebody who truly understands what they are discussing on the
internet. You definitely realize how to bring a problem to light and make
it important. A lot more people should check this out and understand this side of the story.
I was surprised that you’re not more popular because you most certainly possess the gift.

10. pregnancy tips - junio 16, 2013

Hello there, I found your web site by means of Google
even as searching for a comparable matter, your site got here up, it looks good.
I have bookmarked it in my google bookmarks.
Hello there, simply turned into alert to your weblog thru
Google, and found that it is truly informative.

I am going to watch out for brussels. I will appreciate in the event you continue
this in future. Numerous other people might be benefited out of your writing.
Cheers!

11. mamoru-credit.com - junio 17, 2013

This site was… how do I say it? Relevant!! Finally I have found something
that helped me. Appreciate it!

12. planning a wedding on a budget - junio 27, 2013

Hi, I do believe this is a great blog. I stumbledupon it😉 I am going to return
yet again since i have book-marked it. Money and freedom is the greatest way to change,
may you be rich and continue to help other people.

13. pingpalace.com - marzo 12, 2014

Awesome blog! Do you have any tips and hints for aspiring writers?

I’m hoping to start my own website soon but I’m a little lost on everything.
Would you suggest starting with a free platform like WordPress or go for a paid option?
There are so many options out there that I’m completely overwhelmed ..
Any suggestions? Bless you!

14. free xbox 360 emulator for pc - marzo 20, 2014

Very interesting entry.

15. Fix Unico.jar Errors - Windows XP, Vista, 7 & 8 - noviembre 3, 2014

[…] Crear un unico JAR | Java.Lang.NullPointer – Crear un unico JAR marzo 21, 2007 Posted by superpiwi in Eclipse, Java, Programacion. trackback “Un One-jar unico, Un One-jar para encontrarlos a todos y atarlos en las tinieblas”. […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: