miércoles, 15 de mayo de 2013

[JAVA] Empaquetar aplicaciones y sus librerias en un solo jar con NetBeans

Por lo general cuando queremos empaquetar aplicaciones con NetBeans, cuando hacemos un Clean and Build se genera un jar con sus respectivas librerias fuera del jar. 

Si queremos que estas librerias se empaqueten también y generar un solo jar, solo se debe agregar el siguiente código al final del archivo build.xml antes del tag de cierre "</project>":

 <target name="package-for-store" depends="jar">  
     <!-- Cambien el valor de esta propiedad para dar el nombre al JAR,  
        sin la extensión .jar. No debe tener espacios.  
        <property name="store.jar.name" value="NombreDelJar"/>  
     -->  
     <property name="store.jar.name" value="NombreDelJar"/>  
     <!-- No editar nada después de esta línea -->  
     <property name="store.dir" value="store"/>  
     <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>  
     <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>  
     <delete dir="${store.dir}"/>  
     <mkdir dir="${store.dir}"/>  
     <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"/>  
   </target>  

Después de esto, le damos Clean and Build, al proyecto y seguidamente, en el tab de Files, en NetBeans, le damos clic derecho al build.xml, y le damos clic a Run Target -> Other Targets -> package_for_store.

Una vez termine de empaquetar tendremos el jar deseado, en la carpeta "store" dentro de la carpeta del proyecto.

16 comentarios:

  1. Este post me ha servido de mucho. Gracias por la manito :) .

    ResponderBorrar
    Respuestas
    1. Con mucho gusto, para eso es el blog, me alegra que hayas comentado. Este es el primer comentario que recibo jeje :)

      Borrar
  2. Una pregunta.
    Pero ya es mas de progamacion, como hacer que mi aplicacion sea actualizable que el usuario pueda agregarle modulos que yo este lanzando para la aplicacion.?

    ResponderBorrar
    Respuestas
    1. Lo más recomendable es hacer una especie "wrapper" o envoltura, que puede ser un script para ejecutar el jar, o un jar que ejecuta el jar principal, este "wrapper" pregunta a un URL en donde tengamos la aplicación si es la última versión y si no lo es, que el script descargue la nueva versión y reemplace el jar principal.

      También si tenemos un servidor de aplicaciones como glassfish, podemos subir un jar, para ejecución con un webstart (jnlp), pero eso ya tendría que hacer un post para explicar con código como se podría hacer...

      Borrar
  3. te amo :* he intentado miles de veces estas cosas y por fin tu tutorial me sirvio!! a punto de entregar proyecto! mil gracias bro!!

    ResponderBorrar
  4. Hola amigo disculpa hago lo que explicas (o eso creo) y me sale este error:
    Error reading project file C:\Users\alan\Documents\NetBeansProjects\SistemaBibliotecaPrueba\build.xml: Byte no válido 2 de la secuencia UTF-8 de 4 bytes

    ResponderBorrar
    Respuestas
    1. Solo se me ocurre que haya pegado el texto al final de todo, y no antes del tag final "< /project>".

      O si lo editó con otro editor que no es el del netbeans, eso le pudo cambiar la codificación al archivo de build.xml

      También, trate de no escribir como nombre del jar algo con tildes; preferiblemente escribalo sin tildes ni caracteres especiales, ojalá sin espacios.

      Espero que eso le ayude, saludos

      Borrar
  5. hola que tal tengo un problema no se como pasar de .java a .exe la cuestion es de k tengo varias imagenes y no se pasan todas los intente pasar al netbeans y fue un desastre ahorita solo tengo los dos .java y varias imagenes espero puedas ayudarme de vdd ya no se que hacer

    ResponderBorrar
    Respuestas
    1. .java y .exe son dos cosas totalmente distintas, eso no funciona así.

      Lo único que puedes hacer es compilar esos ".java" estos son el código fuente de la aplicación en java, compilarlos como un .jar, de ahí ya se puede correr la aplicación de forma parecida a un .exe, y si lo que necesitas es algo más reconocido por Windows, haces un .bat que debe tener la siguiente linea de comando:

      java -jar nombre_del_compilado.jar >> archivo_de_log.log

      Para compilar los .java en .jar, haces un nuevo proyecto en netbeans, como aplicación java, una vez tengas eso, hace un paquete nuevo en "Source Packages" y pega los .java ahí, luego en las propiedades del proyecto en "Run" escojes la clase Main, que debería ser uno de los .java que tienes. Una vez tienes eso, lo puedes probar con la tecla F6, o puedes compilarlo en .java, dando clic derecho sobre el proyecto y clic sobre "Clean and Build". Esto va a generar el .jar en la carpeta donde creaste el proyecto en una carpeta llamada "dist".

      Siempre tomando en cuenta que todo jar en donde lo ejecute debe tener la misma versión o superior para la que fue compilado, de lo contrario puede dar problemas o no ejecutarse del todo.

      Espero esto te ayude, saludos

      Borrar
    2. entiendo la teoria de lo que me dices pero ya lo intente y si carga y todo pero al cambiarlo para correrlo en otra maquina no se pasan las imagenes me podras apoyar siento k falta muy poco pero la vdd no soy muy bueno en esto tengo teamviewer si es de ayuda

      Borrar
  6. ah este es mi skype estoy en linea te agradeceria muchisimo si me ayudas

    ResponderBorrar
  7. Respuestas
    1. Lo de las imagenes, se debe fijar en el código fuente de la aplicación si utiliza alguna ruta completa dentro del equipo ('C:/aplicacion/imagenes/') o si usa una ruta relativa ('./imagenes/'), de cualquier forma. Debes copiar las imagenes en conjunto con la aplicación. En caso de utilizar rutas completas, crear el mismo directorio o depositar las imagenes en la misma ruta, en el otro equipo.

      Si utiliza rutas relativas, depende de donde se encuentren, lo mejor es cambiar estas rutas en el código fuente.

      Si lo que quieres es empaquetar las imagenes en conjunto con la aplicación es más dificil y depende de como esté programada la aplicación, ya que debes hacer un paquete con las imágenes y dentro del código esto se llama de una manera distinta que las rutas de los archivos normales.

      No uso skype, y se me dificulta ayudarte en este momento por otro medio diferente a este, ya que estoy en el trabajo, pero espero haber sido de ayuda.

      Borrar
    2. si la cuestion es de que quiero subir lo que ya estas hecho a una pagina y que de ahi puedan jugarlo y o descargarlo y jugar es un memorama

      Borrar
  8. Hola.

    He seguido los pasos y ya he conseguido empaquetar toda la aplicación que hice en un solo JAR. El problema es que cuando intento abrir dicho JAR, salta un cuadro de diálogo diciendo "A Java Exception has ocurred".
    El JAR con las librerías por separado (en una carpeta lib) se ejecuta sin problemas.
    ¿A qué podría deberse?

    Gracias...

    ResponderBorrar