viernes, 22 de febrero de 2013

Compilar, Ejecutar y Crear .jar y .jar ejecutable desde Linea de Comandos.

Buenas amigos, en este nuevo tema vamos a ver como compilar, ejecutar y crear un .jar y un .jar ejecutable desde linea de comandos.

Dicho sea de paso, este tema debería haberlo explicado al principio de todo, no lo hice por la razón de no querer meter un "rollazo" de tema nada más comenzar, que ya metí unos cuantos, y con la actual diversidad que existen de IDE's tampoco es que le haga mucha falta a un iniciado, a mi forma de pensar, no obstante, hay cosas que un IDE no puede solucionar, como es el caso de Eclipse y los archivos manifest que no deja modificarlos, caso contrario con netbeans (+1 para él), los cuales han de ser agregados manualmente si quieres que hagan alguna función muy específica.

Bien, no me quiero meter mucha bola a mi mismo en este tema, así que vamos a modificar la variable PATH de windows para comenzar a funcionar:


Lo primero de todo es copiar la ruta de vuestra carpeta "bin" de vuestro jdk. la mía por ejemplo es:

    • C:\Program Files (x86)\Java\jdk1.7.0_03\bin

Una vez copiada, pinchamos sobre el icono de equipo con botón derecho y le damos a "propiedades". Una vez allí le damos a  "Configuración Avanzada del Sistema":


 Una vez en las opciones avanzadas pincháis en "Variables de entorno":


En la ventana de abajo os aparecen las variables del sistema, pincháis en "path" y le dais a "Editar..."


En la ventana de edición os aparecerá el nombre de la variable, y su valor, ahí tenéis que pegar la ruta de la carpeta "bin". OJO!!! Muy importante, habrá otras rutas en el valor de la variable, cuando vayáis a pegarla aseguraos de ponerle " ; " al final de la anterior ruta para que las diferencie. Por ejemplo:
  • C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\Java\jdk1.7.0_03\bin
  • Estas son 2 de las variables que tengo almacenadas, como veis, las tengo separadas por ";" no por espacios!!. Es importante!


Bien, ya tenemos la "Path" configurada, ahora abrimos un bloc de notas y creamos una clase:


Hemos creado nuestra clase en un bloc de notas, ahora la guardamos como "HolaMundo.java". Una vez guardado, podemos cerrar el bloc de notas y abrir una consola de MS-DOS. Si no sabéis abrir una consola de MS-DOS podéis acceder a ella desde la barra de búsqueda de windows (la que esta debajo del "Todos los programas") y escribir "cmd.exe"

Se os abrirá una pequeña ventana de MS-DOS desde la cual vamos a ejecutar nuestros comandos.

Lo primero es ir al directorio donde tenemos guardado nuestro "HolaMundo.java". Antes de continuar me gustaría agregar unas pequeñas nociones de MS-DOS y directorios:

  • Para moverte dentro de un directorio debes escribir "cd NombreDirectorio", también puedes poner la ruta si la conoces "cd NombreDirectorio/NombreSubDirectorio/..."
  • Para movernos hacia atrás escribimos "cd.."
  • Si pulsáis la tecla "up" (flecha hacia arriba), os mostrará la última linea escrita (muy útil).
Con eso ya, por lo menos, podríamos movernos entre directorios.

Bueno, estamos en el directorio de nuestro archivo y lo primero de todo que teneos que hacer es compilar con la siguiente linea de comandos:
  • javac HolaMundo.java.

Si todo ha ido bien, y si estáis siguiendo este tema desde el principio, debería ser así, os aparecerá en el mismo directorio que vuestro "HolaMundo.java" un archivo llamado "HolaMundo.class".

Ya está compilado, ahora lo ejecutamos con la siguiente linea de comando:
  • java HolaMundo

Como veis, lo ejecutamos y nos muestra nuestro mensaje por consola.

Tenemos una clase realizada en un bloc de notas compilada y ejecutada, es hora de ver como comprimirlo en un .jar.

La siguiente linea de comando se utiliza para crear un .jar de nuestra clase:
  • jar cf HolaMundo.jar HolaMundo.class
  • Esta linea es un poco más compleja, se compone de la palabra jar que es el identificador de que vamos a crear un .jar, cf que son opciones que nos indican que se va a crear un nuevo archivo(c) y que nosotros mismos lo vamos a nombrar(f), el nombre que va a llevar nuestro jar(con extensión incluida) y la clase que irá dentro de ese .jar. Cabe decir, que este es un ejemplo muy sencillo, es posible que necesitéis agregar más de una clase, para ello se pone a continuación una de otra separadas entre si por un espacio. Por ejemplo: 
    • jar cf HolaMundo.jar HolaMundo.class OtraClase.class....
  • También es posible que encontréis con clases dentro de paquetes, para ello indicamos la ruta de la clase dentro del paquete. Por ejemplo:
    • jar cf HolaMundo.jar UnPaquete/HolaMundo.class
Como para nosotros es un ejemplo muy sencillo, no nos complicamos:


Una vez generado nuestro .jar podremos ejecutarlo con la siguiente linea de comando:
  • java -cp HolaMundo.jar HolaMundo
  • Otra linea compleja, esta está formada por la instrucción "java" que indica que vamos a ejecutar, -cp que es la classpath de las librerías de java, nuestro .jar y la clase principal de este sin la extensión .class.

Bien, pero llegados a este punto, tenemos que rematar la faena, vamos a crear un .jar ejecutable. Para ello, y solo para mostraros que ejecuta, vamos a modificar nuestra clase, abrimos, la nuestro archivo "HolaMundo.java" y lo modificamos (Si al abrir os pide que utilices un programa de la lista, elegís "bloc de notas" y acordaos de desmarcar la casilla para que nos os abra siempre cualquier .java con "bloc de notas").

Debería quedarnos de la siguiente manera una vez realizada la modificación:


Compilamos como hicimos anteriormente y abrimos otro bloc de notas para crear el archivo Manifest con el siguiente contenido:

Muy importante, cualquier archivo Manifest que creéis, debe de llevar como mínimo estas 3 lineas:
  • Manifest-Version:  Versión del Manifest
  • Class-Path: .---->Para agregar librerías externas.
  • Main-Class:----->Nombre de la clase principal.
Si vuestra clase principal está dentro de un paquete, hay que indicarlo como ruta, separados por puntos " . " en vez de barras " / ".Por ejemplo:
  • Main-Class: UnPaquete.MainClass
Otra cosa más e importante, cuando escribáis la última linea al manifest, pulsar un par de veces "Intro" (saltos de linea) ya que si no, no lo pilla bien y dará error.

Una vez creado lo guardáis, en el mismo directorio que vuestra clase, con el nombre que queráis y la extensión que queráis, pero lo más normal siempre es guardarlo como txt.

Bien, una vez tenéis compilada vuestra clase y vuestro archivo Manifest creado, vamos a meterlo todo junto en un .jar con la siguiente linea de comando:
  • jar cvmf Manifest.txt HolaMundo.jar HolaMundo.class
  • Como antes, jar para indicar que vamos a crear un .jar, la opción (c) de que vamos a crear un archivo,la opción (v) para que nos muestre el proceso por consola, la opción (m) que vamos a agregar un Manifest, la opción (f) la especificación del nombre del archivo a crear, Manifest.txt el manifiesto a cargar, HolaMundo.jar el .jar a crear, y HolaMundo.class la clase principal a agregar. OJO si escribimos las opciones cvmf el Manifest y el .jar deben ir en la misma posición que las opciones (mf) si ponemos las opciones al revés(fm), que podemos, debe de ir primero HolaMundo.jar y después Manifest.txt. Siempre en el mismo orden.

Como veis, me avisa del éxito del agregado y la compresión que le hace. 

Y ya está, podemos ir a nuestro .jar, pincharle 2 veces y ver como se ejecuta, o podemos pasarle la última linea de comandos para ejecutarlo y así terminar con este tema:
  • java -jar HolaMundo.jar
  • La linea java para indicar que vamos ejecutar, -jar para indicarle que lo que se va a ejecutar es un .jar y nuestro archivo .jar.

Y ya está, comenzamos con un bloc de notas y terminamos con un .jar ejecutable. 

Hoy en día, como ya dije al principio, con los IDE's esto está quedando un poco en desuso, pero es la mejor forma de hacerlo. Es un poco rollazo, pero a la vez interesante, ya que por lo menos a mí, en su día, me abrió un poquito más la mente.

Un saludo a todos.

6 comentarios:

  1. compila normalmente si el codigo es solo con una clase, pero no me compila código
    donde hay barias clases como hago en ese caso...

    ResponderEliminar
    Respuestas
    1. llama a las dependencias a un lado ejemplo ...... javac claseHijo.java clasePadre.java etc...

      Eliminar
  2. XAXAXAXAXASASCSA ASSC SCSSSSSSSSCSCA

    ResponderEliminar